diff --git a/BetterLyrics.WinUI3/BetterLyrics.WinUI3/BetterLyrics.WinUI3.csproj b/BetterLyrics.WinUI3/BetterLyrics.WinUI3/BetterLyrics.WinUI3.csproj index 89f7eb7..488e8f1 100644 --- a/BetterLyrics.WinUI3/BetterLyrics.WinUI3/BetterLyrics.WinUI3.csproj +++ b/BetterLyrics.WinUI3/BetterLyrics.WinUI3/BetterLyrics.WinUI3.csproj @@ -34,6 +34,7 @@ + @@ -333,6 +334,11 @@ + + + MSBuild:Compile + + MSBuild:Compile diff --git a/BetterLyrics.WinUI3/BetterLyrics.WinUI3/Controls/LyricsSearchControl.xaml b/BetterLyrics.WinUI3/BetterLyrics.WinUI3/Controls/LyricsSearchControl.xaml index 9c8910f..a99b5ff 100644 --- a/BetterLyrics.WinUI3/BetterLyrics.WinUI3/Controls/LyricsSearchControl.xaml +++ b/BetterLyrics.WinUI3/BetterLyrics.WinUI3/Controls/LyricsSearchControl.xaml @@ -136,66 +136,25 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + - + - + + + - - - - - - - - - - - - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/BetterLyrics.WinUI3/BetterLyrics.WinUI3/Controls/PropertyRow.xaml b/BetterLyrics.WinUI3/BetterLyrics.WinUI3/Controls/PropertyRow.xaml new file mode 100644 index 0000000..3353386 --- /dev/null +++ b/BetterLyrics.WinUI3/BetterLyrics.WinUI3/Controls/PropertyRow.xaml @@ -0,0 +1,90 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/BetterLyrics.WinUI3/BetterLyrics.WinUI3/Controls/PropertyRow.xaml.cs b/BetterLyrics.WinUI3/BetterLyrics.WinUI3/Controls/PropertyRow.xaml.cs new file mode 100644 index 0000000..0eb5ef5 --- /dev/null +++ b/BetterLyrics.WinUI3/BetterLyrics.WinUI3/Controls/PropertyRow.xaml.cs @@ -0,0 +1,125 @@ +using BetterLyrics.WinUI3.Helper; +using BetterLyrics.WinUI3.Services.MediaSessionsService; +using Microsoft.UI.Xaml; +using Microsoft.UI.Xaml.Controls; +using Microsoft.UI.Xaml.Controls.Primitives; +using Microsoft.UI.Xaml.Data; +using Microsoft.UI.Xaml.Input; +using Microsoft.UI.Xaml.Media; +using Microsoft.UI.Xaml.Navigation; +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Runtime.InteropServices.WindowsRuntime; +using System.Threading.Tasks; +using System.Windows.Input; +using Windows.ApplicationModel.DataTransfer; +using Windows.Foundation; +using Windows.Foundation.Collections; + +// To learn more about WinUI, the WinUI project structure, +// and more about our project templates, see: http://aka.ms/winui-project-info. + +namespace BetterLyrics.WinUI3.Controls +{ + public sealed partial class PropertyRow : UserControl + { + public PropertyRow() + { + this.InitializeComponent(); + } + + public string Header + { + get => (string)GetValue(HeaderProperty); + set => SetValue(HeaderProperty, value); + } + public static readonly DependencyProperty HeaderProperty = + DependencyProperty.Register(nameof(Header), typeof(string), typeof(PropertyRow), new PropertyMetadata(string.Empty)); + + public string Value + { + get => (string)GetValue(ValueProperty); + set => SetValue(ValueProperty, value); + } + public static readonly DependencyProperty ValueProperty = + DependencyProperty.Register(nameof(Value), typeof(string), typeof(PropertyRow), new PropertyMetadata(string.Empty)); + + public string Link + { + get => (string)GetValue(LinkProperty); + set => SetValue(LinkProperty, value); + } + public static readonly DependencyProperty LinkProperty = + DependencyProperty.Register(nameof(Link), typeof(string), typeof(PropertyRow), new PropertyMetadata(string.Empty)); + + public string Unit + { + get => (string)GetValue(UnitProperty); + set => SetValue(UnitProperty, value); + } + public static readonly DependencyProperty UnitProperty = + DependencyProperty.Register(nameof(Unit), typeof(string), typeof(PropertyRow), new PropertyMetadata(string.Empty)); + + private Visibility TextVisibility => Link == string.Empty ? Visibility.Visible : Visibility.Collapsed; + private Visibility LinkVisibility => Link != string.Empty ? Visibility.Visible : Visibility.Collapsed; + + private void OnPointerEntered(object sender, PointerRoutedEventArgs e) + { + if (!string.IsNullOrEmpty(Value)) + { + CopyButton.Opacity = 1; + } + } + + private void OnPointerExited(object sender, PointerRoutedEventArgs e) + { + CopyButton.Opacity = 0; + } + + private void OnCopyClicked(object sender, RoutedEventArgs e) + { + if (string.IsNullOrEmpty(Value)) return; + + try + { + DataPackage dataPackage = new DataPackage(); + dataPackage.SetText(Value); + Clipboard.SetContent(dataPackage); + } + catch (Exception ex) + { + System.Diagnostics.Debug.WriteLine($"Copy failed: {ex.Message}"); + return; + } + + CheckIcon.Opacity = 1; + CopyIcon.Opacity = 0; + + this.DispatcherQueue.TryEnqueue(async () => + { + await Task.Delay(1500); + + CheckIcon.Opacity = 0; + CopyIcon.Opacity = 1; + }); + } + + private async void OnLinkClicked(object sender, RoutedEventArgs e) + { + Uri.TryCreate(Link, UriKind.Absolute, out var uri); + if (uri != null) + { + if (uri.Scheme == Uri.UriSchemeHttp || uri.Scheme == Uri.UriSchemeHttps) + { + await Windows.System.Launcher.LaunchUriAsync(uri); + } + else if (uri.Scheme == Uri.UriSchemeFile) + { + await LauncherHelper.SelectAndShowFile(uri.LocalPath); + } + } + } + } +} diff --git a/BetterLyrics.WinUI3/BetterLyrics.WinUI3/Helper/MetadataComparer.cs b/BetterLyrics.WinUI3/BetterLyrics.WinUI3/Helper/MetadataComparer.cs index e04b908..b5f6eef 100644 --- a/BetterLyrics.WinUI3/BetterLyrics.WinUI3/Helper/MetadataComparer.cs +++ b/BetterLyrics.WinUI3/BetterLyrics.WinUI3/Helper/MetadataComparer.cs @@ -2,42 +2,32 @@ using F23.StringSimilarity; using System; using System.Collections.Generic; +using System.IO; using System.Linq; using System.Text; +using System.Text.RegularExpressions; namespace BetterLyrics.WinUI3.Helper { - public static class MetadataComparer + public static partial class MetadataComparer { - // 权重配置 (总和 1.0) private const double WeightTitle = 0.40; private const double WeightArtist = 0.40; private const double WeightAlbum = 0.10; private const double WeightDuration = 0.10; - // 实例化算法 (JaroWinkler 适合短字符串匹配) + // JaroWinkler 适合短字符串匹配 private static readonly JaroWinkler _algo = new JaroWinkler(); - /// - /// 计算 SongInfo 和 LyricsSearchResult 的相似度 (0-100) - /// public static int CalculateScore(SongInfo local, LyricsSearchResult remote) { if (local == null || remote == null) return 0; - // 1. 标题相似度 double titleScore = GetStringSimilarity(local.Title, remote.Title); - - // 2. 艺术家相似度 (需要处理数组顺序) double artistScore = GetArtistSimilarity(local.Artists, remote.Artists); - - // 3. 专辑相似度 double albumScore = GetStringSimilarity(local.Album, remote.Album); - - // 4. 时长相似度 (基于毫秒 vs 秒的转换和容差) double durationScore = GetDurationSimilarity(local.DurationMs, remote.Duration); - // 5. 加权汇总 double totalScore = (titleScore * WeightTitle) + (artistScore * WeightArtist) + (albumScore * WeightAlbum) + @@ -46,9 +36,31 @@ namespace BetterLyrics.WinUI3.Helper return (int)Math.Round(totalScore * 100); } + public static int CalculateScore(SongInfo songInfo, string filePathOrName) + { + if (songInfo == null || string.IsNullOrWhiteSpace(filePathOrName)) return 0; + + string fileName = Path.GetFileNameWithoutExtension(filePathOrName); + string fileFingerprint = CreateSortedFingerprint(fileName); + + var infoParts = new List(); + + if (!string.IsNullOrEmpty(songInfo.Title)) + infoParts.Add(songInfo.Title); + + if (songInfo.Artists != null) + infoParts.AddRange(songInfo.Artists); + + string infoRaw = string.Join(" ", infoParts); + string infoFingerprint = CreateSortedFingerprint(infoRaw); + + double score = _algo.Similarity(infoFingerprint, fileFingerprint); + + return (int)Math.Round(score * 100); + } + private static double GetStringSimilarity(string? s1, string? s2) { - // 归一化:转小写,去空白 s1 = s1?.Trim().ToLowerInvariant() ?? ""; s2 = s2?.Trim().ToLowerInvariant() ?? ""; @@ -63,8 +75,7 @@ namespace BetterLyrics.WinUI3.Helper if (localArtists == null || localArtists.Length == 0) return 0.0; if (remoteArtists == null || remoteArtists.Length == 0) return 0.0; - // 技巧:将艺术家数组排序并连接,避免顺序不同导致的不匹配 - // 例如: ["Jay-Z", "Linkin Park"] 和 ["Linkin Park", "Jay-Z"] 应该是一样的 + // 将艺术家数组排序并连接,避免顺序不同导致的不匹配 var s1 = string.Join(" ", localArtists.OrderBy(a => a).Select(a => a.Trim().ToLowerInvariant())); var s2 = string.Join(" ", remoteArtists.OrderBy(a => a).Select(a => a.Trim().ToLowerInvariant())); @@ -78,7 +89,6 @@ namespace BetterLyrics.WinUI3.Helper double localSeconds = localMs / 1000.0; double diff = Math.Abs(localSeconds - remoteSeconds.Value); - // 容差逻辑: // 差距 <= 3秒:100% 相似 // 差距 >= 20秒:0% 相似 // 中间线性插值 @@ -89,8 +99,24 @@ namespace BetterLyrics.WinUI3.Helper if (diff <= PerfectTolerance) return 1.0; if (diff >= MaxTolerance) return 0.0; - // 线性递减公式 return 1.0 - ((diff - PerfectTolerance) / (MaxTolerance - PerfectTolerance)); } + + private static string CreateSortedFingerprint(string input) + { + if (string.IsNullOrWhiteSpace(input)) return ""; + + input = input.ToLowerInvariant(); + + string cleaned = NonWordCharactersRegex().Replace(input, " "); + + var tokens = cleaned.Split(new[] { ' ' }, StringSplitOptions.RemoveEmptyEntries) + .OrderBy(t => t); // 排序 + + return string.Join(" ", tokens); + } + + [GeneratedRegex(@"[\p{P}\p{S}]")] + private static partial Regex NonWordCharactersRegex(); } } diff --git a/BetterLyrics.WinUI3/BetterLyrics.WinUI3/Providers/AppleMusic.cs b/BetterLyrics.WinUI3/BetterLyrics.WinUI3/Providers/AppleMusic.cs index 8e51f05..4d4a34a 100644 --- a/BetterLyrics.WinUI3/BetterLyrics.WinUI3/Providers/AppleMusic.cs +++ b/BetterLyrics.WinUI3/BetterLyrics.WinUI3/Providers/AppleMusic.cs @@ -1,4 +1,7 @@ -using BetterLyrics.WinUI3.Helper; +using BetterLyrics.WinUI3.Extensions; +using BetterLyrics.WinUI3.Helper; +using BetterLyrics.WinUI3.Models; +using Lyricify.Lyrics.Providers.Web.QQMusic; using System; using System.Net; using System.Net.Http; @@ -67,7 +70,7 @@ namespace BetterLyrics.WinUI3.Providers _client.DefaultRequestHeaders.Add("Accept-Language", $"{_language},en;q=0.9"); } - public async Task GetLyricsAsync(string id) + private async Task GetLyricsAsync(string id) { var apiUrl = $"https://amp-api.music.apple.com/v1/catalog/{_storefront}/songs/{id}"; var url = apiUrl + $"?include[songs]=lyrics,syllable-lyrics&l={_language}"; @@ -109,9 +112,14 @@ namespace BetterLyrics.WinUI3.Providers return null; } - public async Task SearchSongInfoAsync(string artist, string title) + public async Task SearchSongInfoAsync(Models.SongInfo songInfo) { - var query = $"{artist} {title}"; + LyricsSearchResult lyricsSearchResult = new() + { + Provider = Enums.LyricsSearchProvider.AppleMusic + }; + + var query = $"{songInfo.DisplayArtists} {songInfo.Title}"; var apiUrl = $"https://amp-api.music.apple.com/v1/catalog/{_storefront}/search"; var url = apiUrl + $"?term={WebUtility.UrlEncode(query)}&types=songs&limit=1&l={_language}"; var resp = await _client.GetStringAsync(url); @@ -120,9 +128,26 @@ namespace BetterLyrics.WinUI3.Providers if (results.TryGetProperty("songs", out var songs) && songs.GetProperty("data").GetArrayLength() > 0) { var song = songs.GetProperty("data")[0]; - return song.GetProperty("id").ToString(); + + var id = song.GetProperty("id").ToString(); + + var attr = song.GetProperty("attributes"); + + lyricsSearchResult.Title = attr.GetProperty("name").ToString(); + lyricsSearchResult.Artists = attr.GetProperty("artistName").ToString().SplitByCommonSplitter(); + lyricsSearchResult.Album = attr.GetProperty("albumName").ToString(); + lyricsSearchResult.Duration = attr.GetProperty("durationInMillis").GetInt32() / 1000.0; + + lyricsSearchResult.Reference = $"https://music.apple.com/song/{id}"; + lyricsSearchResult.MatchPercentage = MetadataComparer.CalculateScore(songInfo, lyricsSearchResult); + + if (id != null) + { + lyricsSearchResult.Raw = await GetLyricsAsync(id); + } } - return string.Empty; + + return lyricsSearchResult; } } } diff --git a/BetterLyrics.WinUI3/BetterLyrics.WinUI3/Services/LyricsSearchService/LyricsSearchService.cs b/BetterLyrics.WinUI3/BetterLyrics.WinUI3/Services/LyricsSearchService/LyricsSearchService.cs index 0e3cefc..7821142 100644 --- a/BetterLyrics.WinUI3/BetterLyrics.WinUI3/Services/LyricsSearchService/LyricsSearchService.cs +++ b/BetterLyrics.WinUI3/BetterLyrics.WinUI3/Services/LyricsSearchService/LyricsSearchService.cs @@ -205,8 +205,6 @@ namespace BetterLyrics.WinUI3.Services.LyricsSearchService try { - LyricsFormat lyricsFormat = provider.GetLyricsFormat(); - // Check cache first if allowed if (checkCache && provider.IsRemote()) { @@ -226,7 +224,7 @@ namespace BetterLyrics.WinUI3.Services.LyricsSearchService } else { - lyricsSearchResult = await SearchFile(songInfo, lyricsFormat); + lyricsSearchResult = await SearchFile(songInfo, provider.GetLyricsFormat()); } } else @@ -258,7 +256,6 @@ namespace BetterLyrics.WinUI3.Services.LyricsSearchService if (token.IsCancellationRequested) { - lyricsSearchResult.MatchPercentage = MetadataComparer.CalculateScore(songInfo, lyricsSearchResult); return lyricsSearchResult; } @@ -267,8 +264,6 @@ namespace BetterLyrics.WinUI3.Services.LyricsSearchService { } - lyricsSearchResult.MatchPercentage = MetadataComparer.CalculateScore(songInfo, lyricsSearchResult); - if (lyricsSearchResult.IsFound) { if (provider.IsRemote()) @@ -282,6 +277,9 @@ namespace BetterLyrics.WinUI3.Services.LyricsSearchService private async Task SearchFile(SongInfo songInfo, LyricsFormat format) { + int maxScore = 0; + string? bestFile = null; + var lyricsSearchResult = new LyricsSearchResult(); if (format.ToLyricsSearchProvider() is LyricsSearchProvider lyricsSearchProvider) @@ -297,18 +295,11 @@ namespace BetterLyrics.WinUI3.Services.LyricsSearchService { foreach (var file in DirectoryHelper.GetAllFiles(folder.Path, $"*{format.ToFileExtension()}")) { - var fileName = Path.GetFileNameWithoutExtension(file); - if (StringHelper.IsSwitchableNormalizedMatch(fileName, songInfo.Title, songInfo.DisplayArtists) || songInfo.LinkedFileName == fileName) + int score = MetadataComparer.CalculateScore(songInfo, file); + if (score > maxScore) { - string? raw = await File.ReadAllTextAsync(file, FileHelper.GetEncoding(file)); - if (raw != null) - { - lyricsSearchResult.Raw = raw; - lyricsSearchResult.CopyFromSongInfo(songInfo); - lyricsSearchResult.Reference = file; - - return lyricsSearchResult; - } + bestFile = file; + maxScore = score; } } } @@ -317,11 +308,27 @@ namespace BetterLyrics.WinUI3.Services.LyricsSearchService } } } + + if (bestFile != null) + { + lyricsSearchResult.Reference = bestFile; + lyricsSearchResult.MatchPercentage = maxScore; + + string? raw = await File.ReadAllTextAsync(bestFile, FileHelper.GetEncoding(bestFile)); + if (raw != null) + { + lyricsSearchResult.Raw = raw; + } + } + return lyricsSearchResult; } private LyricsSearchResult SearchEmbedded(SongInfo songInfo) { + int maxScore = 0; + string? bestFile = null; + var lyricsSearchResult = new LyricsSearchResult { Provider = LyricsSearchProvider.LocalMusicFile, @@ -336,24 +343,39 @@ namespace BetterLyrics.WinUI3.Services.LyricsSearchService if (FileHelper.MusicExtensions.Contains(Path.GetExtension(file))) { var track = new Track(file); - if ((songInfo.Album != "" && track.Title == songInfo.Title && track.Artist == songInfo.DisplayArtists && track.Album == songInfo.Album) - || (songInfo.Album == "" && track.Title == songInfo.Title && track.Artist == songInfo.DisplayArtists) - || (songInfo.Album == "" && StringHelper.IsSwitchableNormalizedMatch(Path.GetFileNameWithoutExtension(file), songInfo.Title, songInfo.DisplayArtists))) + int score = MetadataComparer.CalculateScore(songInfo, new LyricsSearchResult { - var plain = track.GetRawLyrics(); - if (!plain.IsNullOrEmpty()) - { - lyricsSearchResult.Raw = plain; - lyricsSearchResult.CopyFromSongInfo(songInfo); - lyricsSearchResult.Reference = file; + Title = track.Title, + Artists = track.Artist.Split(ATL.Settings.DisplayValueSeparator), + Album = track.Album, + Duration = track.Duration + }); - return lyricsSearchResult; - } + if (score > maxScore) + { + maxScore = score; + bestFile = file; } } } } } + + if (bestFile != null) + { + var track = new Track(bestFile); + + lyricsSearchResult.Title = track.Title; + lyricsSearchResult.Artists = track.Artist.Split(ATL.Settings.DisplayValueSeparator); + lyricsSearchResult.Album = track.Album; + lyricsSearchResult.Duration = track.Duration; + + lyricsSearchResult.Raw = track.GetRawLyrics(); + + lyricsSearchResult.Reference = bestFile; + lyricsSearchResult.MatchPercentage = maxScore; + } + return lyricsSearchResult; } @@ -425,6 +447,8 @@ namespace BetterLyrics.WinUI3.Services.LyricsSearchService catch { } } + lyricsSearchResult.MatchPercentage = MetadataComparer.CalculateScore(songInfo, lyricsSearchResult); + if (string.IsNullOrWhiteSpace(rawLyricFile)) { return lyricsSearchResult; @@ -503,6 +527,8 @@ namespace BetterLyrics.WinUI3.Services.LyricsSearchService lyricsSearchResult.Reference = url; + lyricsSearchResult.MatchPercentage = MetadataComparer.CalculateScore(songInfo, lyricsSearchResult); + return lyricsSearchResult; } @@ -602,26 +628,23 @@ namespace BetterLyrics.WinUI3.Services.LyricsSearchService lyricsSearchResult.Album = result?.Album; lyricsSearchResult.Duration = result?.DurationMs / 1000; + lyricsSearchResult.MatchPercentage = MetadataComparer.CalculateScore(songInfo, lyricsSearchResult); + return lyricsSearchResult; } private async Task SearchAppleMusicAsync(SongInfo songInfo) { - var lyricsSearchResult = new LyricsSearchResult + LyricsSearchResult lyricsSearchResult = new() { - Provider = LyricsSearchProvider.AppleMusic, + Provider = LyricsSearchProvider.AppleMusic }; + _logger.LogInformation("SearchAppleMusicAsync"); + if (await _appleMusic.InitAsync()) { - string id = await _appleMusic.SearchSongInfoAsync(songInfo.DisplayArtists, songInfo.Title); - string? raw = await _appleMusic.GetLyricsAsync(id); - _logger.LogInformation("SearchAppleMusicAsync"); - lyricsSearchResult.Raw = raw; - lyricsSearchResult.Title = songInfo.Title; - lyricsSearchResult.Artists = songInfo.Artists; - lyricsSearchResult.Album = ""; - lyricsSearchResult.Reference = $"https://music.apple.com/song/{id}"; + lyricsSearchResult = await _appleMusic.SearchSongInfoAsync(songInfo); } return lyricsSearchResult; diff --git a/BetterLyrics.WinUI3/BetterLyrics.WinUI3/Strings/en-US/Resources.resw b/BetterLyrics.WinUI3/BetterLyrics.WinUI3/Strings/en-US/Resources.resw index 9557d5a..650df9a 100644 --- a/BetterLyrics.WinUI3/BetterLyrics.WinUI3/Strings/en-US/Resources.resw +++ b/BetterLyrics.WinUI3/BetterLyrics.WinUI3/Strings/en-US/Resources.resw @@ -144,6 +144,9 @@ Cancel + + Copy + Playlist was created successfully @@ -228,7 +231,7 @@ Lyrics not found - + Lyrics provider @@ -237,7 +240,7 @@ Lyrics Window Management Shortcut Settings - + Match percentage @@ -264,7 +267,7 @@ Show translation only - + Translation provider @@ -273,7 +276,7 @@ Artist - + Duration @@ -306,9 +309,6 @@ Target lyrics search provider - - Title - Lyrics search - BetterLyrics @@ -565,6 +565,9 @@ If you encounter any problems, please go to the Settings page, About tab, and vi Advanced options + + Album + Album art @@ -610,6 +613,9 @@ If you encounter any problems, please go to the Settings page, About tab, and vi Apply + + Artist + Automatic adjustment @@ -1189,12 +1195,15 @@ If you encounter any problems, please go to the Settings page, About tab, and vi Play - + Playback source - + Playback source ID + + Current playback source + Play "Cut To The Feeling" on "soundcloud.com" @@ -1219,6 +1228,9 @@ If you encounter any problems, please go to the Settings page, About tab, and vi Recorded window status + + Reference link + Original files and folders in this path will not be deleted when removing it from this app @@ -1258,6 +1270,9 @@ If you encounter any problems, please go to the Settings page, About tab, and vi The duration of the first line + + Current lyrics search result + Test server @@ -1321,6 +1336,12 @@ If you encounter any problems, please go to the Settings page, About tab, and vi Right + + Current song + + + Title + [Experimental] Spectrum Layer diff --git a/BetterLyrics.WinUI3/BetterLyrics.WinUI3/Strings/ja-JP/Resources.resw b/BetterLyrics.WinUI3/BetterLyrics.WinUI3/Strings/ja-JP/Resources.resw index 59435b9..a0f46a2 100644 --- a/BetterLyrics.WinUI3/BetterLyrics.WinUI3/Strings/ja-JP/Resources.resw +++ b/BetterLyrics.WinUI3/BetterLyrics.WinUI3/Strings/ja-JP/Resources.resw @@ -144,6 +144,9 @@ キャンセル + + コピー + 正常に作成されました @@ -228,7 +231,7 @@ 歌詞が見つかりません - + 歌詞プロバイダー @@ -237,7 +240,7 @@ 歌詞ウィンドウ管理ショートカット設定 - + マッチ率 @@ -264,7 +267,7 @@ 翻訳のみを表示します - + 翻訳プロバイダー @@ -273,7 +276,7 @@ アーティスト - + 間隔 @@ -306,9 +309,6 @@ ターゲット歌詞検索プロバイダー - - タイトル - 歌詞検索 - BetterLyrics @@ -565,6 +565,9 @@ 高度なオプション + + アルバム + アルバムアート @@ -610,6 +613,9 @@ 適用する + + アーティスト + 自動調整 @@ -1189,12 +1195,15 @@ 遊ぶ - + 再生ソース - + 再生ソースID + + 現在の再生ソース + 「SoundCloud.com」で「Cut to the Feeling」を再生する @@ -1219,6 +1228,9 @@ 記録されたウィンドウステータス + + 参照リンク + このパスの元のファイルとフォルダーは、このアプリから削除するときに削除されません @@ -1258,6 +1270,9 @@ 最初の行の期間 + + 現在の歌詞検索結果 + テストサーバー @@ -1321,6 +1336,12 @@ + + 現在の曲です + + + タイトル + [実験的] スペクトラムレイヤー diff --git a/BetterLyrics.WinUI3/BetterLyrics.WinUI3/Strings/ko-KR/Resources.resw b/BetterLyrics.WinUI3/BetterLyrics.WinUI3/Strings/ko-KR/Resources.resw index ed4ee66..2350090 100644 --- a/BetterLyrics.WinUI3/BetterLyrics.WinUI3/Strings/ko-KR/Resources.resw +++ b/BetterLyrics.WinUI3/BetterLyrics.WinUI3/Strings/ko-KR/Resources.resw @@ -144,6 +144,9 @@ 취소 + + 접수 + 재생 목록이 성공적으로 생성되었습니다 @@ -228,7 +231,7 @@ 가사를 찾을 수 없습니다 - + 가사 제공자 @@ -237,7 +240,7 @@ 가사 창 관리 바로 가기 설정 - + 매치 퍼센트 @@ -264,7 +267,7 @@ 번역 만 표시하십시오 - + 번역 제공자 @@ -273,7 +276,7 @@ 아티스트 - + 지속 @@ -306,9 +309,6 @@ 가사 검색 공급자를 타겟팅하십시오 - - 제목 - 가사 검색 - BetterLyrics @@ -565,6 +565,9 @@ 고급 옵션 + + 앨범 + 앨범 아트 @@ -610,6 +613,9 @@ 적용하다 + + 아티스트 + 자동 조정 @@ -1189,12 +1195,15 @@ 놀다 - + 재생 소스 - + 재생 소스 ID + + 현재 재생 소스 + "soundcloud.com"에서 "Fut to the Feeling"을 재생하십시오. @@ -1219,6 +1228,9 @@ 기록 된 창 상태 + + 참고문헌 + 이 경로의 원본 파일과 폴더는이 앱에서 제거 할 때 삭제되지 않습니다. @@ -1258,6 +1270,9 @@ 첫 번째 줄의 기간 + + 현재 가사 검색 결과 + 테스트 서버 @@ -1321,6 +1336,12 @@ 오른쪽 + + 현재 노래 + + + 제목 + [실험] 스펙트럼 레이어 diff --git a/BetterLyrics.WinUI3/BetterLyrics.WinUI3/Strings/zh-CN/Resources.resw b/BetterLyrics.WinUI3/BetterLyrics.WinUI3/Strings/zh-CN/Resources.resw index 1d0da53..fab3668 100644 --- a/BetterLyrics.WinUI3/BetterLyrics.WinUI3/Strings/zh-CN/Resources.resw +++ b/BetterLyrics.WinUI3/BetterLyrics.WinUI3/Strings/zh-CN/Resources.resw @@ -144,6 +144,9 @@ 取消 + + 拷贝 + 播放列表创建成功 @@ -228,7 +231,7 @@ 未找到歌词 - + 歌词来源 @@ -237,7 +240,7 @@ 歌词窗口管理快捷设置 - + 匹配百分比 @@ -264,7 +267,7 @@ 仅显示翻译 - + 翻译来源 @@ -273,7 +276,7 @@ 艺术家 - + 时长 @@ -306,9 +309,6 @@ 目标歌词搜索提供商 - - 标题 - 歌词搜索 - BetterLyrics @@ -565,6 +565,9 @@ 高级选项 + + 专辑 + 专辑 @@ -610,6 +613,9 @@ 应用 + + 艺术家 + 自动调整 @@ -1189,12 +1195,15 @@ 播放 - + 播放源 - + 播放源 ID + + 当前播放源 + 在 “soundcloud.com” 上播放 “Cut to the Feeling” @@ -1219,6 +1228,9 @@ 记录的窗口状态 + + 参考链接 + 路径中的原始文件和文件夹不会被删除 @@ -1258,6 +1270,9 @@ 首行持续时间 + + 当前歌词搜索结果 + 测试服务器 @@ -1321,6 +1336,12 @@ 靠右 + + 当前歌曲 + + + 标题 + [实验性] 频谱层 diff --git a/BetterLyrics.WinUI3/BetterLyrics.WinUI3/Strings/zh-TW/Resources.resw b/BetterLyrics.WinUI3/BetterLyrics.WinUI3/Strings/zh-TW/Resources.resw index b5a698d..0fa3dc6 100644 --- a/BetterLyrics.WinUI3/BetterLyrics.WinUI3/Strings/zh-TW/Resources.resw +++ b/BetterLyrics.WinUI3/BetterLyrics.WinUI3/Strings/zh-TW/Resources.resw @@ -144,6 +144,9 @@ 取消 + + 複製 + 已成功建立播放清單 @@ -228,7 +231,7 @@ 找不到歌詞 - + 歌詞來源 @@ -237,7 +240,7 @@ 歌詞視窗管理快捷設定 - + 匹配百分比 @@ -264,7 +267,7 @@ 僅顯示翻譯 - + 翻譯來源 @@ -273,7 +276,7 @@ 藝術家 - + 時長 @@ -306,9 +309,6 @@ 目標歌詞搜尋提供者 - - 標題 - 歌詞搜尋 - BetterLyrics @@ -565,6 +565,9 @@ 高級選項 + + 專輯 + 專輯 @@ -610,6 +613,9 @@ 應用 + + 藝術家 + 自動調整 @@ -1189,12 +1195,15 @@ 播放 - + 播放源 - + 播放源 ID + + 當前播放源 + 在 “soundcloud.com” 上播放 “Cut to the Feeling” @@ -1219,6 +1228,9 @@ 記錄的窗口狀態 + + 參考數據 + 路徑中的原始檔案和資料夾不會被刪除 @@ -1258,6 +1270,9 @@ 首行持續時間 + + 目前歌詞搜尋結果 + 測試服務器 @@ -1321,6 +1336,12 @@ 靠右 + + 當前歌曲 + + + 標題 + [實驗性] 頻譜層