Files
psysonic/src/locales/en/search.ts
T
cucadmuh 4ac373a65b feat(search): scoped live search on browse pages (#938)
* feat(artists): scoped live search badge replaces page filter

Move Artists browse text search into the header Live Search with a page
scope badge (Users icon), field-local undo, and double-click/backspace
to clear scope. Block the live-search dropdown while scoped so results
only filter the Artists grid; mobile overlay follows the same rules.

* fix(artists): plain grid for scoped search fixes broken card layout

Route the browse grid through VirtualCardGrid, switch to non-virtual CSS
grid when live search filters the catalog, reset scroll on filter changes,
and skip content-visibility on plain tiles to avoid blank/black cards.

* fix(search): scope badge double-Backspace and single clear control

Require two Backspaces on an empty scoped field after prior text input;
one Backspace still clears the badge when the field was never filled.
Move live-search clear/advanced controls inside the field pill, drop the
extra outer clear button, and use type=text to avoid native search clears.

* fix(search): drop duplicate outer live-search clear button

Keep the native in-field clear on type=search and the original pill layout;
remove only the extra × control outside the search border. Reset dropdown
state when the query is cleared via the native control.

* refactor(search): generic scoped browse query helper, drop dead code

Rename artistsBrowseSearchQuery to scopedBrowseSearchQuery with an
expectedScope argument; wire Artists via useScopedBrowseSearchQuery.
Remove unused liveSearchScoped dropdown helper (scoped mode blocks it).

* feat(search): ghost scope badge and single-click badge remove

After clearing the artists scope on /artists, show a faded ghost chip to
restore page-only search while keeping the global search placeholder.
Active badge removes on one click; tooltips and styles updated.

* feat(search): scoped live search for All Albums and New Releases

Wire albums and newReleases scope badges with debounced album title search
(local index title-only FTS + filtered search3). Plain grid, scroll reset,
and session query restore on album grid browse pages.

* fix(browse): preserve scroll restore after album/artist detail back

Only reset in-page scroll when filter resetKey changes, not when
isScrollRestorePending clears after session restore.

* feat(search): scoped live search for Tracks browse

Wire /tracks to header live search with wide title/artist/album FTS,
hide hero and discovery rails while search is active, and remove the
inline search field from the browse list.

* fix(search): clear header query when leaving scoped browse pages

Prevent global live search from firing on album/detail routes after a
scoped browse query; browse session stashes still restore on back.

* fix(tracks): restore scroll after back from detail during scoped search

Hold stashed song results across fetchSongPage churn, defer leave-stash
teardown past AppShell scroll reset, restore tracks scroll after the list
is ready, and save scroll snapshot when opening artist from song context menu.

* fix(tracks): hide discovery headings during scoped search

Hide the page subtitle and "Browse all tracks" section title when
tracks search is active, matching hero/rails chrome behavior.

* feat(search): scoped live search for Composers browse

Wire /composers to header live search with composers scope badge,
session stash, scroll restore, and plain grid/list during text filter.
Remove the in-page filter input; add i18n and navigation helpers.

* docs: CHANGELOG and credits for scoped browse live search (PR #938)
2026-06-01 13:04:36 +03:00

83 lines
3.4 KiB
TypeScript

export const search = {
placeholder: 'Search for artist, album or song…',
noResults: 'No results for "{{query}}"',
artists: 'Artists',
albums: 'Albums',
songs: 'Songs',
clearLabel: 'Clear search',
addedToQueueToast: 'Added "{{title}}" to queue',
title: 'Search',
resultsFor: 'Results for "{{query}}"',
album: 'Album',
advanced: 'Advanced Search',
localIndexBadge: 'Local index',
localIndexBadgeTooltip: 'Results from the local library index on this device',
networkSearchBadge: 'Server search',
networkSearchBadgeTooltip: 'Results from live search on the connected server',
liveSearchFailed: 'Search failed — try again',
advancedSearchTerm: 'Search term',
advancedSearchPlaceholder: 'Title, album, artist…',
advancedGenre: 'Genre',
advancedAllGenres: 'All genres',
advancedYear: 'Year',
advancedYearFrom: 'from',
advancedYearTo: 'to',
advancedBpm: 'BPM',
advancedBpmClear: 'Clear BPM filter',
advancedLossless: 'Format',
advancedLosslessOnly: 'Lossless only',
bpmSourceTag: 'BPM from file tag',
bpmSourceAnalysis: 'BPM from audio analysis',
advancedMoodGroup: 'Mood',
advancedAllMoods: 'All moods',
advancedMoodLocalNote: 'Requires local library index and track analysis',
advancedAll: 'All',
advancedSearch: 'Search',
advancedEmpty: 'Enter a search term or select a filter to begin.',
advancedNoResults: 'No results found.',
advancedGenreNote: 'Songs are randomly selected from this genre.',
recentSearches: 'Recent Searches',
browse: 'Browse',
emptyHint: 'What do you want to hear?',
scopeArtistsPlaceholder: 'Search for artist…',
scopeArtistsBadgeTooltip: 'Click to remove',
scopeArtistsGhostTooltip: 'Click to search on this page only',
scopeAlbumsPlaceholder: 'Search for album…',
scopeAlbumsBadgeTooltip: 'Click to remove',
scopeAlbumsGhostTooltip: 'Click to search on this page only',
scopeNewReleasesPlaceholder: 'Search new releases…',
scopeNewReleasesBadgeTooltip: 'Click to remove',
scopeNewReleasesGhostTooltip: 'Click to search on this page only',
scopeTracksPlaceholder: 'Find a track by title, artist or album…',
scopeTracksBadgeTooltip: 'Click to remove',
scopeTracksGhostTooltip: 'Click to search on this page only',
scopeComposersPlaceholder: 'Search for composer…',
scopeComposersBadgeTooltip: 'Click to remove',
scopeComposersGhostTooltip: 'Click to search on this page only',
genres: 'Genres',
shareLink: 'Share link',
shareTrackTitle: 'Shared track',
shareQueueTitle_one: 'Shared queue ({{count}} track)',
shareQueueTitle_other: 'Shared queue ({{count}} tracks)',
shareQueueAction: 'Add to queue',
shareQueueing: 'Adding to queue…',
shareQueued_one: 'Added {{count}} shared track to queue',
shareQueued_other: 'Added {{count}} shared tracks to queue',
shareQueuedPartial: 'Added {{queued}} of {{total}} shared tracks to queue ({{skipped}} not found).',
shareUnsupportedTitle: 'This share link cannot be used here',
shareUnsupportedSub: 'Use a track, album, artist, composer, or queue share link.',
shareFromServer: 'From {{server}}',
shareQueuePreview: 'Preview tracks',
shareQueuePreviewLoading: 'Loading tracks…',
shareQueuePreviewEmpty: 'No tracks from this link could be found on the server.',
shareQueuePreviewSkipped: '{{skipped}} of {{total}} tracks were not found on this server.',
moodGroups: {
joy: 'Joy',
sadness: 'Sadness',
dance: 'Dance',
work: 'Work',
romance: 'Romance',
anger: 'Anger',
},
};