diff --git a/src/i18n/en/index.ts b/src/i18n/en/index.ts
index 8818871..87b96ff 100644
--- a/src/i18n/en/index.ts
+++ b/src/i18n/en/index.ts
@@ -1,274 +1,276 @@
import type { BaseTranslation } from "../i18n-types";
const en = {
- infoPopup: {
- buildBy: "Built by ",
- version: "version",
- releaseNotes: "Release Notes"
+ infoPopup: {
+ buildBy: "Built by ",
+ version: "version",
+ releaseNotes: "Release Notes"
+ },
+ sidebar: {
+ search: "Search",
+ library: "Library",
+ albums: "Albums",
+ favorites: "Favourites",
+ toDelete: "To Delete",
+ playlists: "Playlists",
+ smartPlaylists: "Smart Playlists",
+ artistsToolkit: "Artist's Toolkit",
+ map: "Map",
+ internetArchive: "Internet Archive",
+ stats: "Stats",
+ openWikiTooltip: "Open Wiki panel for {artist}",
+ addMetadataHint: "Add metadata",
+ takeControl: "Take control of your library",
+ iaMode:
+ "Main player off in Internet Archive mode
Stop playback to re-enable"
+ },
+ library: {
+ fields: {
+ title: "Title",
+ artist: "Artist",
+ composer: "Composer",
+ album: "Album",
+ albumArtist: "Album Artist",
+ track: "Track",
+ compilation: "Compil",
+ year: "Year",
+ dateAdded: "Date Added",
+ genre: "Genre",
+ origin: "Origin",
+ duration: "Duration",
+ tags: "Tags"
},
- sidebar: {
- search: "Search",
- library: "Library",
- albums: "Albums",
- favorites: "Favourites",
- toDelete: "To Delete",
- playlists: "Playlists",
- smartPlaylists: "Smart Playlists",
- artistsToolkit: "Artist's Toolkit",
- map: "Map",
- internetArchive: "Internet Archive",
- stats: "Stats",
- openWikiTooltip: "Open Wiki panel for {artist}",
- addMetadataHint: "Add metadata",
- takeControl: "Take control of your library",
- iaMode: "Main player off in Internet Archive mode
Stop playback to re-enable"
+ resetToFileOrder: "Reset to file order",
+ orderHint: "Showing file order",
+ orderHintTemp: "Showing temporary order",
+ orderDisabledHint: "Switch to file order to re-order tracks",
+ queryNoResultsPlaceholder: "No results for \"{query}\""
+ },
+ bottomBar: {
+ queue: "Queue",
+ lyrics: "Lyrics",
+ lossySelector: {
+ lossy: "lossy",
+ lossless: "lossless",
+ both: "lossy + lossless"
},
- library: {
- fields: {
- title: "Title",
- artist: "Artist",
- composer: "Composer",
- album: "Album",
- albumArtist: "Album Artist",
- track: "Track",
- compilation: "Compil",
- year: "Year",
- dateAdded: "Date Added",
- genre: "Genre",
- origin: "Origin",
- duration: "Duration",
- tags: "Tags"
- },
- resetToFileOrder: "Reset to file order",
- orderHint: "Showing file order",
- orderHintTemp: "Showing temporary order",
- orderDisabledHint: "Switch to file order to re-order tracks"
+ nextUp: "Next Up",
+ stats: {
+ songs: "songs",
+ artists: "artists",
+ albums: "albums"
+ }
+ },
+ smartPlaylists: {
+ builtIn: {
+ recentlyAdded: "Recently Added",
+ favourites: "Favourites"
},
- bottomBar: {
- queue: "Queue",
- lyrics: "Lyrics",
- lossySelector: {
- lossy: "lossy",
- lossless: "lossless",
- both: "lossy + lossless"
+ builder: {
+ close: "Close editor",
+ save: "Save",
+ placeholder: "My New Smart Playlist",
+ addNewBlock: "add new block",
+ valid: "query is valid",
+ invalid: "query is invalid",
+ parts: {
+ byArtist: {
+ title: "by artist",
+ example: "eg. by Charlie Parker"
},
- nextUp: "Next Up",
- stats: {
- songs: "songs",
- artists: "artists",
- albums: "albums"
- }
- },
- smartPlaylists: {
- builtIn: {
- recentlyAdded: "Recently Added",
- favourites: "Favourites"
+ releasedBetween: {
+ title: "released between",
+ example: "eg. released between 1950 and 1967"
},
- builder: {
- close: "Close editor",
- save: "Save",
- placeholder: "My New Smart Playlist",
- addNewBlock: "add new block",
- valid: "query is valid",
- invalid: "query is invalid",
- parts: {
- byArtist: {
- title: "by artist",
- example: "eg. by Charlie Parker"
- },
- releasedBetween: {
- title: "released between",
- example: "eg. released between 1950 and 1967"
- },
- releasedAfter: {
- title: "released after",
- example: "eg. released after 1950"
- },
- releasedIn: {
- title: "released in",
- example: "eg. released in 1999"
- },
- titleContains: {
- title: "song title contains {text}",
- example: " eg. title contains Love"
- },
- longerThan: {
- title: "longer than",
- example: "eg. longer than 04:00"
- },
- containsGenre: {
- title: "contains genre",
- example: "eg. contains Rock"
- },
- fromCountry: {
- title: "from country",
- example: "eg. from Australia"
- },
- byComposer: {
- title: "by composer",
- example: "eg. by Charles Mingus"
- },
- containsTag: {
- title: "contains tag",
- example: "eg. contains love"
- }
- }
+ releasedAfter: {
+ title: "released after",
+ example: "eg. released after 1950"
},
- newSmartPlaylist: "New smart playlist",
- libraryPlaceholder: {
- title: "Smart playlist results will appear here",
- subtitle: "Happy searching!"
- }
- },
- trackInfo: {
- title: "Track Info",
- subtitle: "Use UP and DOWN to change tracks",
- overwriteFile: "Overwrite file",
- fileInfo: "File Info",
- file: "File",
- codec: "Codec",
- tagType: "Tag Type",
- duration: "Duration",
- sampleRate: "Sample rate",
- bitRate: "Bitrate",
- enrichmentCenter: "Enrichment Center",
- countryOfOrigin: "Country of Origin",
- countryOfOriginTooltip:
- "Set this to use the Map view and filter by country in Smart Playlists",
- fetchingOriginCountry: "Loading...",
- save: "Save",
- fetchFromWikipedia: "Fetch from Wikipedia",
- artworkReadyToSave: "Ready to save",
- artworkFound: "Found",
- noArtwork: "No artwork",
- artworkTooltip: "Paste image or click to select file",
- fetchArt: "Fetch Art",
- metadata: "Metadata",
- tools: "Tools",
- aboutArtwork: "About artwork",
- artworkTooltipTitle: "🎨 Artwork priority",
- artworkTooltipBody:
- "
🎨 Artwork priority
First, Musicat looks for artwork encoded in the file metadata, which you can overwrite by clicking this square (png and jpg supported).
If there is none, it will look for a file in the album folder called cover.jpg, folder.jpg or artwork.jpg (you can change this list of filenames in Settings).
Otherwise, it will look for any image in the album folder and use that.",
- encodedInFile: "Encoded in file",
- bit: "bit",
- noMetadata: "Song has no metadata",
- unsupportedFormat:
- "This file type is not yet supported for metadata viewing/editing",
- fix: "Fix",
- errors: {
- nullChars:
- "Some tags have a hidden character that prevents them from being read properly."
+ releasedIn: {
+ title: "released in",
+ example: "eg. released in 1999"
},
- artist: "artist",
- fixLegacyEncodings: {
- title: "Fix legacy encodings",
- body: "If you have ID3 tags encoded with legacy encodings, you should update them to the universal UTF-8 so they display properly. Select an encoding and click Fix.",
- hint: "Select encoding..."
+ titleContains: {
+ title: "song title contains {text}",
+ example: " eg. title contains Love"
},
- setTitleFromFileNameHint: "Click to set title from filename"
- },
- settings: {
- title: "Settings",
- library: "Library",
- audio: "Audio",
- outputDevice: "Output device",
- followSystem: "Same as system device",
- interface: "Interface",
- features: "Features",
- subtitle: "Configure stuff",
- version: "Version",
- commaSeparatedFilenames: "filenames",
- llms: "gpt-3.5-turbo, gpt-4, ollama",
- foldersToWatch: "Folders to watch",
- folder: "{{1 folder | ?? folders}}",
- importing: "Importing..",
- enableArtistsToolkit: "Enable Artist's Toolkit",
- songbookLocation: "Songbook location",
- scrapbookLocation: "Scrapbook location",
- enableAIFeatures: "Enable AI features",
- aiModel: "AI Model (LLM)",
- openApiKey: "OpenAI API Key",
- geniusApiKey: "Genius API Key",
- discogsApiKey: "Discogs API Key"
- },
- wiki: {
- inArticle: "Found mentions from your library:",
- clickHint: "Click to scroll to mention",
- albums: "Albums",
- songs: "Songs",
- artists: "Artists"
- },
- tagCloud: {
- close: "Close tags"
- },
- artistsToolkit: {
- header: {
- songbookLocationHint:
- "Your songbook location managed by Musicat. Currently set to {path}",
- songbookLocationHintEmpty:
- "Please set your songbook location to be managed by Musicat.",
- showScrapbook: "Show scrapbook",
- hideScrapbook: "Hide scrapbook"
+ longerThan: {
+ title: "longer than",
+ example: "eg. longer than 04:00"
},
- scrapbook: {
- title: "Scrapbook",
- setupHint: "Please set up your scrapbook location in settings",
- notFoundError: "Scrapbook location not found",
- openSettings: "Open settings",
- openInFinder: "Open in Finder"
+ containsGenre: {
+ title: "contains genre",
+ example: "eg. contains Rock"
},
- songDetails: {
- tabs: {
- lyrics: "Lyrics & Chords",
- files: "Files",
- other: "Other"
- },
- lyricsEditor: {
- options: {
- alignFirstChord: "Align 1st chord"
- }
- }
+ fromCountry: {
+ title: "from country",
+ example: "eg. from Australia"
+ },
+ byComposer: {
+ title: "by composer",
+ example: "eg. by Charles Mingus"
+ },
+ containsTag: {
+ title: "contains tag",
+ example: "eg. contains love"
}
+ }
},
- button: {
- areYouSure: "Click again to confirm"
+ newSmartPlaylist: "New smart playlist",
+ libraryPlaceholder: {
+ title: "Smart playlist results will appear here",
+ subtitle: "Happy searching!"
+ }
+ },
+ trackInfo: {
+ title: "Track Info",
+ subtitle: "Use UP and DOWN to change tracks",
+ overwriteFile: "Overwrite file",
+ fileInfo: "File Info",
+ file: "File",
+ codec: "Codec",
+ tagType: "Tag Type",
+ duration: "Duration",
+ sampleRate: "Sample rate",
+ bitRate: "Bitrate",
+ enrichmentCenter: "Enrichment Center",
+ countryOfOrigin: "Country of Origin",
+ countryOfOriginTooltip:
+ "Set this to use the Map view and filter by country in Smart Playlists",
+ fetchingOriginCountry: "Loading...",
+ save: "Save",
+ fetchFromWikipedia: "Fetch from Wikipedia",
+ artworkReadyToSave: "Ready to save",
+ artworkFound: "Found",
+ noArtwork: "No artwork",
+ artworkTooltip: "Paste image or click to select file",
+ fetchArt: "Fetch Art",
+ metadata: "Metadata",
+ tools: "Tools",
+ aboutArtwork: "About artwork",
+ artworkTooltipTitle: "🎨 Artwork priority",
+ artworkTooltipBody:
+ "🎨 Artwork priority
First, Musicat looks for artwork encoded in the file metadata, which you can overwrite by clicking this square (png and jpg supported).
If there is none, it will look for a file in the album folder called cover.jpg, folder.jpg or artwork.jpg (you can change this list of filenames in Settings).
Otherwise, it will look for any image in the album folder and use that.",
+ encodedInFile: "Encoded in file",
+ bit: "bit",
+ noMetadata: "Song has no metadata",
+ unsupportedFormat:
+ "This file type is not yet supported for metadata viewing/editing",
+ fix: "Fix",
+ errors: {
+ nullChars:
+ "Some tags have a hidden character that prevents them from being read properly."
},
- input: {
- enterHintTooltip: "Press ENTER to autocomplete"
+ artist: "artist",
+ fixLegacyEncodings: {
+ title: "Fix legacy encodings",
+ body: "If you have ID3 tags encoded with legacy encodings, you should update them to the universal UTF-8 so they display properly. Select an encoding and click Fix.",
+ hint: "Select encoding..."
},
- albums: {
- title: "Albums",
- options: {
- orderBy: "order by",
- orderByFields: {
- title: "Title",
- artist: "Artist",
- year: "Year"
- },
- showSingles: "show singles",
- showInfo: "show info",
- gridSize: "grid size"
- },
- scrollToNowPlaying: "Scroll to Now playing",
- item: {
- tracksLabel: "tracks"
- }
+ setTitleFromFileNameHint: "Click to set title from filename"
+ },
+ settings: {
+ title: "Settings",
+ library: "Library",
+ audio: "Audio",
+ outputDevice: "Output device",
+ followSystem: "Same as system device",
+ interface: "Interface",
+ features: "Features",
+ subtitle: "Configure stuff",
+ version: "Version",
+ commaSeparatedFilenames: "filenames",
+ llms: "gpt-3.5-turbo, gpt-4, ollama",
+ foldersToWatch: "Folders to watch",
+ folder: "{{1 folder | ?? folders}}",
+ importing: "Importing..",
+ enableArtistsToolkit: "Enable Artist's Toolkit",
+ songbookLocation: "Songbook location",
+ scrapbookLocation: "Scrapbook location",
+ enableAIFeatures: "Enable AI features",
+ aiModel: "AI Model (LLM)",
+ openApiKey: "OpenAI API Key",
+ geniusApiKey: "Genius API Key",
+ discogsApiKey: "Discogs API Key"
+ },
+ wiki: {
+ inArticle: "Found mentions from your library:",
+ clickHint: "Click to scroll to mention",
+ albums: "Albums",
+ songs: "Songs",
+ artists: "Artists"
+ },
+ tagCloud: {
+ close: "Close tags"
+ },
+ artistsToolkit: {
+ header: {
+ songbookLocationHint:
+ "Your songbook location managed by Musicat. Currently set to {path}",
+ songbookLocationHintEmpty:
+ "Please set your songbook location to be managed by Musicat.",
+ showScrapbook: "Show scrapbook",
+ hideScrapbook: "Hide scrapbook"
},
- trackMenu: {
- removeFromLibrary: "Remove {{track | ?? tracks}} from library",
- deleteFile: "Delete {{file | ?? files}}",
- deleteFileHint: "Move to system Trash / Recycle bin"
+ scrapbook: {
+ title: "Scrapbook",
+ setupHint: "Please set up your scrapbook location in settings",
+ notFoundError: "Scrapbook location not found",
+ openSettings: "Open settings",
+ openInFinder: "Open in Finder"
},
- toDelete: {
- title: "To Delete",
- description: "Tracks to delete from Prune Mode",
- keepAllBtn: "Keep all",
- deleteAllBtn: "Move all to trash",
- notification: {
- deleting: "Deleting {{track | ?? tracks}}",
- deleted: "Deleted {{track | ?? tracks}}"
+ songDetails: {
+ tabs: {
+ lyrics: "Lyrics & Chords",
+ files: "Files",
+ other: "Other"
+ },
+ lyricsEditor: {
+ options: {
+ alignFirstChord: "Align 1st chord"
}
+ }
+ }
+ },
+ button: {
+ areYouSure: "Click again to confirm"
+ },
+ input: {
+ enterHintTooltip: "Press ENTER to autocomplete"
+ },
+ albums: {
+ title: "Albums",
+ options: {
+ orderBy: "order by",
+ orderByFields: {
+ title: "Title",
+ artist: "Artist",
+ year: "Year"
+ },
+ showSingles: "show singles",
+ showInfo: "show info",
+ gridSize: "grid size"
+ },
+ scrollToNowPlaying: "Scroll to Now playing",
+ item: {
+ tracksLabel: "tracks"
+ }
+ },
+ trackMenu: {
+ removeFromLibrary: "Remove {{track | ?? tracks}} from library",
+ deleteFile: "Delete {{file | ?? files}}",
+ deleteFileHint: "Move to system Trash / Recycle bin"
+ },
+ toDelete: {
+ title: "To Delete",
+ description: "Tracks to delete from Prune Mode",
+ keepAllBtn: "Keep all",
+ deleteAllBtn: "Move all to trash",
+ notification: {
+ deleting: "Deleting {{track | ?? tracks}}",
+ deleted: "Deleted {{track | ?? tracks}}"
}
+ }
} satisfies BaseTranslation;
export default en;
diff --git a/src/i18n/i18n-types.ts b/src/i18n/i18n-types.ts
index aa8f168..57d4f0b 100644
--- a/src/i18n/i18n-types.ts
+++ b/src/i18n/i18n-types.ts
@@ -162,6 +162,11 @@ type RootTranslation = {
* S​w​i​t​c​h​ ​t​o​ ​f​i​l​e​ ​o​r​d​e​r​ ​t​o​ ​r​e​-​o​r​d​e​r​ ​t​r​a​c​k​s
*/
orderDisabledHint: string
+ /**
+ * N​o​ ​r​e​s​u​l​t​s​ ​f​o​r​ ​"​{​q​u​e​r​y​}​"
+ * @param {unknown} query
+ */
+ queryNoResultsPlaceholder: RequiredParams<'query'>
}
bottomBar: {
/**
@@ -951,6 +956,10 @@ export type TranslationFunctions = {
* Switch to file order to re-order tracks
*/
orderDisabledHint: () => LocalizedString
+ /**
+ * No results for "{query}"
+ */
+ queryNoResultsPlaceholder: (arg: { query: unknown }) => LocalizedString
}
bottomBar: {
/**
diff --git a/src/lib/library/CanvasLibrary.svelte b/src/lib/library/CanvasLibrary.svelte
index b76891f..d3f3219 100644
--- a/src/lib/library/CanvasLibrary.svelte
+++ b/src/lib/library/CanvasLibrary.svelte
@@ -83,6 +83,7 @@
import ImportPlaceholder from "./ImportPlaceholder.svelte";
import TrackMenu from "./TrackMenu.svelte";
import Scrollbar from "../ui/Scrollbar.svelte";
+ import QueryResultsPlaceholder from "./QueryResultsPlaceholder.svelte";
export let allSongs = null;
export let dim = false;
@@ -2474,6 +2475,9 @@
{#if $isSmartQueryBuilderOpen && noSongs}
{/if}
+ {#if $query.query?.length && noSongs}
+
+ {/if}
{/if}
diff --git a/src/lib/library/QueryResultsPlaceholder.svelte b/src/lib/library/QueryResultsPlaceholder.svelte
new file mode 100644
index 0000000..b773bac
--- /dev/null
+++ b/src/lib/library/QueryResultsPlaceholder.svelte
@@ -0,0 +1,29 @@
+
+
+
+
{$LL.library.queryNoResultsPlaceholder({ query: $query.query })}
+
+
+