From eace67e464551141b5ce245cf4f690228f392609 Mon Sep 17 00:00:00 2001 From: schroda <50052685+schroda@users.noreply.github.com> Date: Sun, 25 Jan 2026 03:51:13 +0100 Subject: [PATCH] Exclude "local source" for language detection for sources language filter The local source is always shown, and therefore its language ("other") should only be shown in the language filter in case an actual source is installed that supports is of "other" language. --- src/features/browse/sources/Sources.tsx | 17 ++++++++++++++--- .../source/components/SourceLanguageSelect.tsx | 2 ++ src/features/source/services/Sources.ts | 11 +++++++++-- src/i18n/locales/en.po | 4 ++++ 4 files changed, 29 insertions(+), 5 deletions(-) diff --git a/src/features/browse/sources/Sources.tsx b/src/features/browse/sources/Sources.tsx index 63c14fb5..c466ef05 100644 --- a/src/features/browse/sources/Sources.tsx +++ b/src/features/browse/sources/Sources.tsx @@ -56,6 +56,14 @@ export function Sources({ tabsMenuHeight }: { tabsMenuHeight: number }) { }), [sources, shownLangs], ); + const sourcesForLanguageFilter = useMemo( + () => + SourceService.filter(sources ?? [], { + showNsfw, + keepLocalSource: false, + }), + [sources], + ); const sourcesByLanguage = useMemo(() => { const lastUsedSource = SourceService.getLastUsedSource(lastUsedSourceId, filteredSources); const groupedByLanguageTuple = Object.entries( @@ -72,7 +80,10 @@ export function Sources({ tabsMenuHeight }: { tabsMenuHeight: number }) { return groupedByLanguageTuple; }, [filteredSources]); - const sourceLanguages = useMemo(() => SourceService.getLanguages(sources ?? []), [sources]); + const sourceLanguages = useMemo( + () => SourceService.getLanguages(sourcesForLanguageFilter, { excludeLocalSource: true }), + [sources], + ); const areSourcesFromDifferentRepos = useMemo( () => SourceService.areFromMultipleRepos(filteredSources), [filteredSources], @@ -108,10 +119,10 @@ export function Sources({ tabsMenuHeight }: { tabsMenuHeight: number }) { selectedLanguages={shownLangs} setSelectedLanguages={setShownLangs} languages={sourceLanguages} - sources={sources ?? []} + sources={sourcesForLanguageFilter} /> , - [t, shownLangs, sourceLanguages, sources], + [t, shownLangs, sourceLanguages, sourcesForLanguageFilter], ); if (isLoading) return ; diff --git a/src/features/source/components/SourceLanguageSelect.tsx b/src/features/source/components/SourceLanguageSelect.tsx index 48578190..1e767a02 100644 --- a/src/features/source/components/SourceLanguageSelect.tsx +++ b/src/features/source/components/SourceLanguageSelect.tsx @@ -21,6 +21,7 @@ import { GroupedVirtuoso } from 'react-virtuoso'; import ListItemAvatar from '@mui/material/ListItemAvatar'; import { useLingui } from '@lingui/react/macro'; import Checkbox from '@mui/material/Checkbox'; +import Box from '@mui/material/Box'; import { CustomTooltip } from '@/base/components/CustomTooltip.tsx'; import { translateExtensionLanguage } from '@/features/extension/Extensions.utils.ts'; import { languageSortComparator, toUniqueLanguageCodes } from '@/base/utils/Languages.ts'; @@ -139,6 +140,7 @@ export const SourceLanguageSelect = ({ {t`Allowed Languages`} + {!languages.length && {t`No sources installed`}} !Sources.isLocalSource(source)) + : sources; + + return [...new Set(filteredSources.map(Sources.getLanguage))]; } static groupByLanguage( diff --git a/src/i18n/locales/en.po b/src/i18n/locales/en.po index eb99e500..3227605d 100644 --- a/src/i18n/locales/en.po +++ b/src/i18n/locales/en.po @@ -2300,6 +2300,10 @@ msgstr "No pages found" msgid "No sources found. Install Some extensions first." msgstr "No sources found. Install Some extensions first." +#: src/features/source/components/SourceLanguageSelect.tsx +msgid "No sources installed" +msgstr "No sources installed" + #: src/features/backup/Backup.utils.ts #: src/features/category/components/CategoriesInclusionSetting.tsx #: src/features/downloads/screens/DownloadSettings.tsx