From 0fd5bb32841e2b6623d08eca4d3d73c3b562a54d Mon Sep 17 00:00:00 2001 From: schroda <50052685+schroda@users.noreply.github.com> Date: Wed, 14 Jan 2026 16:33:37 +0100 Subject: [PATCH] Fix missing "custom app languages" Regression c1ac58f4d60498ef439bbf3160b0b223fab669eb --- src/base/components/inputs/LanguageSelect.tsx | 11 +++++------ src/base/utils/Languages.ts | 9 +++++++++ src/features/extension/Extensions.utils.ts | 4 ++-- .../source/components/SourceLanguageSelect.tsx | 11 +++++------ src/features/source/services/Sources.ts | 4 ++-- src/lib/ISOLanguageUtil.ts | 2 +- 6 files changed, 24 insertions(+), 17 deletions(-) diff --git a/src/base/components/inputs/LanguageSelect.tsx b/src/base/components/inputs/LanguageSelect.tsx index 7d202e36..c275b06f 100644 --- a/src/base/components/inputs/LanguageSelect.tsx +++ b/src/base/components/inputs/LanguageSelect.tsx @@ -21,8 +21,7 @@ import { Virtuoso } from 'react-virtuoso'; import { useLingui } from '@lingui/react/macro'; import { CustomTooltip } from '@/base/components/CustomTooltip.tsx'; import { translateExtensionLanguage } from '@/features/extension/Extensions.utils.ts'; -import { languageSortComparator } from '@/base/utils/Languages.ts'; -import { toUniqueISOLanguageCodes } from '@/lib/ISOLanguageUtil.ts'; +import { languageSortComparator, toUniqueLanguageCodes } from '@/base/utils/Languages.ts'; interface IProps { selectedLanguages: string[]; @@ -34,12 +33,12 @@ export function LanguageSelect(props: IProps) { const { t } = useLingui(); const { selectedLanguages, setSelectedLanguages, languages } = props; - const [tmpSelectedLanguages, setTmpSelectedLanguages] = useState(toUniqueISOLanguageCodes(selectedLanguages)); + const [tmpSelectedLanguages, setTmpSelectedLanguages] = useState(toUniqueLanguageCodes(selectedLanguages)); const [open, setOpen] = useState(false); const languagesSortedBySelectState = useMemo( () => - toUniqueISOLanguageCodes([ + toUniqueLanguageCodes([ ...tmpSelectedLanguages.toSorted(languageSortComparator), ...languages.toSorted(languageSortComparator), ]), @@ -48,12 +47,12 @@ export function LanguageSelect(props: IProps) { const handleCancel = () => { setOpen(false); - setTmpSelectedLanguages(toUniqueISOLanguageCodes(selectedLanguages)); + setTmpSelectedLanguages(toUniqueLanguageCodes(selectedLanguages)); }; const handleOk = () => { setOpen(false); - setSelectedLanguages(toUniqueISOLanguageCodes(tmpSelectedLanguages)); + setSelectedLanguages(toUniqueLanguageCodes(tmpSelectedLanguages)); }; const handleChange = (language: string, selected: boolean) => { diff --git a/src/base/utils/Languages.ts b/src/base/utils/Languages.ts index 1564728a..f75319c5 100644 --- a/src/base/utils/Languages.ts +++ b/src/base/utils/Languages.ts @@ -53,6 +53,15 @@ export function languageCodeToName(code: string): string { return getLanguage(code).nativeName; } +export const toUniqueLanguageCodes = (codes: string[]): string[] => { + const languages = codes.map((code) => getLanguage(code)); + const languagesByIsoCode = Object.groupBy(languages, (language) => language.isoCode); + + return Object.entries(languagesByIsoCode) + .filter(([, languagesOfIsoCode]) => !!languagesOfIsoCode?.length) + .map(([, languagesOfIsoCode]) => languagesOfIsoCode![0].orgCode); +}; + export const toComparableLanguage = (code: string): string => getLanguage(code).isoCode; export const toComparableLanguages = (codes: string[]): string[] => codes.map(toComparableLanguage); diff --git a/src/features/extension/Extensions.utils.ts b/src/features/extension/Extensions.utils.ts index c2911889..61d6ecf0 100644 --- a/src/features/extension/Extensions.utils.ts +++ b/src/features/extension/Extensions.utils.ts @@ -20,6 +20,7 @@ import { languageSpecialSortComparator, toComparableLanguage, toComparableLanguages, + toUniqueLanguageCodes, } from '@/base/utils/Languages.ts'; import { EXTENSION_ACTION_TO_FAILURE_TRANSLATION_MAP, @@ -29,7 +30,6 @@ import { enhancedCleanup } from '@/base/utils/Strings.ts'; import { requestManager } from '@/lib/requests/RequestManager.ts'; import { makeToast } from '@/base/utils/Toast.ts'; import { getErrorMessage } from '@/lib/HelperFunctions.ts'; -import { toUniqueISOLanguageCodes } from '@/lib/ISOLanguageUtil.ts'; import { i18n } from '@/i18n'; export const getInstalledState = ( @@ -131,7 +131,7 @@ export const filterExtensions = ( query?: string | null | undefined; } = {}, ): TExtension[] => { - const normalizedSelectedLanguages = toComparableLanguages(toUniqueISOLanguageCodes(selectedLanguages ?? [])); + const normalizedSelectedLanguages = toComparableLanguages(toUniqueLanguageCodes(selectedLanguages ?? [])); return extensions .filter( diff --git a/src/features/source/components/SourceLanguageSelect.tsx b/src/features/source/components/SourceLanguageSelect.tsx index dbf77f5b..523cb567 100644 --- a/src/features/source/components/SourceLanguageSelect.tsx +++ b/src/features/source/components/SourceLanguageSelect.tsx @@ -23,7 +23,7 @@ import ListItemAvatar from '@mui/material/ListItemAvatar'; import { useLingui } from '@lingui/react/macro'; import { CustomTooltip } from '@/base/components/CustomTooltip.tsx'; import { translateExtensionLanguage } from '@/features/extension/Extensions.utils.ts'; -import { languageSortComparator } from '@/base/utils/Languages.ts'; +import { languageSortComparator, toUniqueLanguageCodes } from '@/base/utils/Languages.ts'; import { SourceDisplayNameInfo, SourceIconInfo, @@ -38,7 +38,6 @@ import { requestManager } from '@/lib/requests/RequestManager.ts'; import { ListCardAvatar } from '@/base/components/lists/cards/ListCardAvatar.tsx'; import { makeToast } from '@/base/utils/Toast.ts'; import { getErrorMessage } from '@/lib/HelperFunctions.ts'; -import { toUniqueISOLanguageCodes } from '@/lib/ISOLanguageUtil.ts'; export const SourceLanguageSelect = ({ selectedLanguages, @@ -60,14 +59,14 @@ export const SourceLanguageSelect = ({ const [tmpSourceIdToEnabledState, setTmpSourceIdToEnabledState] = useState>({}); - const [tmpSelectedLanguages, setTmpSelectedLanguages] = useState(toUniqueISOLanguageCodes(selectedLanguages)); + const [tmpSelectedLanguages, setTmpSelectedLanguages] = useState(toUniqueLanguageCodes(selectedLanguages)); const [open, setOpen] = useState(false); const sourcesByLanguage = useMemo(() => Sources.groupByLanguage(sources), [sources]); const languagesSortedBySelectState = useMemo( () => - toUniqueISOLanguageCodes([ + toUniqueLanguageCodes([ ...tmpSelectedLanguages.toSorted(languageSortComparator), ...languages.toSorted(languageSortComparator), ]), @@ -78,7 +77,7 @@ export const SourceLanguageSelect = ({ setOpen(false); setTmpSourceIdToEnabledState({}); - setTmpSelectedLanguages(toUniqueISOLanguageCodes(selectedLanguages)); + setTmpSelectedLanguages(toUniqueLanguageCodes(selectedLanguages)); }; const handleOk = () => { @@ -90,7 +89,7 @@ export const SourceLanguageSelect = ({ ), ).catch((e) => makeToast(t`Failed to save changes`, 'error', getErrorMessage(e))); setTmpSourceIdToEnabledState({}); - setSelectedLanguages(toUniqueISOLanguageCodes(tmpSelectedLanguages)); + setSelectedLanguages(toUniqueLanguageCodes(tmpSelectedLanguages)); }; const handleChange = (language: string, selected: boolean) => { diff --git a/src/features/source/services/Sources.ts b/src/features/source/services/Sources.ts index 6b2f6b08..f7b1ad34 100644 --- a/src/features/source/services/Sources.ts +++ b/src/features/source/services/Sources.ts @@ -21,6 +21,7 @@ import { languageSpecialSortComparator, toComparableLanguage, toComparableLanguages, + toUniqueLanguageCodes, } from '@/base/utils/Languages.ts'; import { getSourceMetadata } from '@/features/source/services/SourceMetadata.ts'; import { @@ -29,7 +30,6 @@ import { } from '@/features/settings/services/ServerSettingsMetadata.ts'; import { makeToast } from '@/base/utils/Toast.ts'; import { getErrorMessage } from '@/lib/HelperFunctions.ts'; -import { toUniqueISOLanguageCodes } from '@/lib/ISOLanguageUtil.ts'; export class Sources { static readonly LOCAL_SOURCE_ID = '0'; @@ -98,7 +98,7 @@ export class Sources { enabled?: boolean; } = {}, ): Source[] { - const normalizedLanguages = toComparableLanguages(toUniqueISOLanguageCodes(languages ?? [])); + const normalizedLanguages = toComparableLanguages(toUniqueLanguageCodes(languages ?? [])); return sources .filter( diff --git a/src/lib/ISOLanguageUtil.ts b/src/lib/ISOLanguageUtil.ts index f567b061..5b0c823f 100644 --- a/src/lib/ISOLanguageUtil.ts +++ b/src/lib/ISOLanguageUtil.ts @@ -101,7 +101,7 @@ export function getISOLanguage(code: string): LanguageObject | null { ); } -export const toUniqueISOLanguageCodes = (codes: string[]): string[] => { +const toUniqueISOLanguageCodes = (codes: string[]): string[] => { const languages = codes.map((code) => getISOLanguage(code)).filter((code) => code !== null); const languagesByIsoCode = Object.groupBy(languages, (language) => language.isoCode);