fix: apple music metadata fetch missing

This commit is contained in:
Zhe Fang
2025-11-19 11:32:05 -05:00
parent 7e6ce08c56
commit 2d0839d777
13 changed files with 591 additions and 253 deletions

View File

@@ -34,6 +34,7 @@
<None Remove="Controls\LyricsWindowSwitchControl.xaml" /> <None Remove="Controls\LyricsWindowSwitchControl.xaml" />
<None Remove="Controls\MediaSettingsControl.xaml" /> <None Remove="Controls\MediaSettingsControl.xaml" />
<None Remove="Controls\PlaybackSettingsControl.xaml" /> <None Remove="Controls\PlaybackSettingsControl.xaml" />
<None Remove="Controls\PropertyRow.xaml" />
<None Remove="Controls\ShortcutTextBox.xaml" /> <None Remove="Controls\ShortcutTextBox.xaml" />
<None Remove="Controls\SystemTray.xaml" /> <None Remove="Controls\SystemTray.xaml" />
<None Remove="Views\LyricsSearchWindow.xaml" /> <None Remove="Views\LyricsSearchWindow.xaml" />
@@ -333,6 +334,11 @@
<ItemGroup> <ItemGroup>
<Folder Include="TemplateSelector\" /> <Folder Include="TemplateSelector\" />
</ItemGroup> </ItemGroup>
<ItemGroup>
<Page Update="Controls\PropertyRow.xaml">
<Generator>MSBuild:Compile</Generator>
</Page>
</ItemGroup>
<ItemGroup> <ItemGroup>
<Page Update="Controls\AboutControl.xaml"> <Page Update="Controls\AboutControl.xaml">
<Generator>MSBuild:Compile</Generator> <Generator>MSBuild:Compile</Generator>

View File

@@ -136,66 +136,25 @@
<ListView.ItemTemplate> <ListView.ItemTemplate>
<DataTemplate x:DataType="models:LyricsSearchResult"> <DataTemplate x:DataType="models:LyricsSearchResult">
<ListViewItem IsEnabled="{x:Bind IsFound}"> <ListViewItem IsEnabled="{x:Bind IsFound}">
<StackPanel Padding="3,6" Opacity="{x:Bind IsFound, Converter={StaticResource BoolToPartialOpacityConverter}}"> <StackPanel Padding="0,6" Opacity="{x:Bind IsFound, Converter={StaticResource BoolToPartialOpacityConverter}}">
<HyperlinkButton <local:PropertyRow
Padding="0" Margin="-12,0,0,0"
Content="{x:Bind Provider, Converter={StaticResource LyricsSearchProviderToDisplayNameConverter}}" Link="{x:Bind Reference, Mode=OneWay}"
NavigateUri="{x:Bind Reference, FallbackValue=about:blank}" /> Value="{x:Bind Provider, Mode=OneWay, Converter={StaticResource LyricsSearchProviderToDisplayNameConverter}}" />
<!-- Title --> <!-- Lyrics search result -->
<Grid ColumnSpacing="12" Visibility="{x:Bind IsFound, Converter={StaticResource BoolToVisibilityConverter}}"> <StackPanel Visibility="{x:Bind IsFound, Converter={StaticResource BoolToVisibilityConverter}}">
<Grid.ColumnDefinitions> <local:PropertyRow x:Uid="SettingsPageSongTitle" Value="{x:Bind Title, TargetNullValue=N/A, Mode=OneWay}" />
<ColumnDefinition Width="Auto" /> <local:PropertyRow x:Uid="SettingsPageArtist" Value="{x:Bind DisplayArtists, TargetNullValue=N/A, Mode=OneWay}" />
<ColumnDefinition Width="*" /> <local:PropertyRow x:Uid="SettingsPageAlbum" Value="{x:Bind Album, TargetNullValue=N/A, Mode=OneWay}" />
</Grid.ColumnDefinitions> <local:PropertyRow
<TextBlock x:Uid="LyricsSearchControlTitle" Grid.Column="0" /> x:Uid="LyricsSearchControlDurauion"
<RichTextBlock Grid.Column="1" Foreground="{ThemeResource TextFillColorSecondaryBrush}"> Unit="s"
<Paragraph> Value="{x:Bind Duration, TargetNullValue=N/A, Mode=OneWay}" />
<Run Text="{x:Bind Title, TargetNullValue=N/A, Mode=OneWay}" /> <local:PropertyRow
</Paragraph> x:Uid="LyricsPageMatchPercentage"
</RichTextBlock> Unit="%"
</Grid> Value="{x:Bind MatchPercentage, Mode=OneWay}" />
<!-- Artist --> <local:PropertyRow x:Uid="SettingsPageReference" Value="{x:Bind Reference, TargetNullValue=N/A, Mode=OneWay}" />
<Grid ColumnSpacing="12" Visibility="{x:Bind IsFound, Converter={StaticResource BoolToVisibilityConverter}}">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto" />
<ColumnDefinition Width="*" />
</Grid.ColumnDefinitions>
<TextBlock x:Uid="LyricsSearchControlArtist" Grid.Column="0" />
<RichTextBlock Grid.Column="1" Foreground="{ThemeResource TextFillColorSecondaryBrush}">
<Paragraph>
<Run Text="{x:Bind DisplayArtists, TargetNullValue=N/A, Mode=OneWay}" />
</Paragraph>
</RichTextBlock>
</Grid>
<!-- Album -->
<Grid ColumnSpacing="12" Visibility="{x:Bind IsFound, Converter={StaticResource BoolToVisibilityConverter}}">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto" />
<ColumnDefinition Width="*" />
</Grid.ColumnDefinitions>
<TextBlock x:Uid="LyricsSearchControlAlbum" Grid.Column="0" />
<RichTextBlock Grid.Column="1" Foreground="{ThemeResource TextFillColorSecondaryBrush}">
<Paragraph>
<Run Text="{x:Bind Album, TargetNullValue=N/A, Mode=OneWay}" />
</Paragraph>
</RichTextBlock>
</Grid>
<!-- Duration -->
<StackPanel
Orientation="Horizontal"
Spacing="6"
Visibility="{x:Bind IsFound, Converter={StaticResource BoolToVisibilityConverter}}">
<TextBlock x:Uid="LyricsSearchControlDurauion" />
<TextBlock Foreground="{ThemeResource TextFillColorSecondaryBrush}" Text="{x:Bind Duration}" />
<TextBlock Foreground="{ThemeResource TextFillColorSecondaryBrush}" Text="s" />
</StackPanel>
<!-- Match percentage -->
<StackPanel
Orientation="Horizontal"
Spacing="6"
Visibility="{x:Bind IsFound, Converter={StaticResource BoolToVisibilityConverter}}">
<TextBlock x:Uid="LyricsPageMatchPercentage" />
<TextBlock Foreground="{ThemeResource TextFillColorSecondaryBrush}" Text="{x:Bind MatchPercentage}" />
</StackPanel> </StackPanel>
<!-- NOT FOUND --> <!-- NOT FOUND -->
<TextBlock <TextBlock

View File

@@ -255,96 +255,75 @@
<Grid Style="{StaticResource SettingsGridStyle}"> <Grid Style="{StaticResource SettingsGridStyle}">
<StackPanel Spacing="{StaticResource SettingsCardSpacing}"> <StackPanel Spacing="{StaticResource SettingsCardSpacing}">
<!-- Provider info --> <!-- Realtime info -->
<TextBlock x:Uid="SettingsPageRealtimeStatus" Style="{StaticResource SettingsSectionHeaderTextBlockStyle}" /> <TextBlock x:Uid="SettingsPageRealtimeStatus" Style="{StaticResource SettingsSectionHeaderTextBlockStyle}" />
<dev:SettingsCard ContentAlignment="Left">
<!-- Playback source info -->
<Expander
x:Uid="SettingsPagePlaybackStatus"
HorizontalAlignment="Stretch"
HorizontalContentAlignment="Left">
<StackPanel Spacing="6"> <StackPanel Spacing="6">
<!-- Playback source --> <!-- Playback source -->
<Grid ColumnSpacing="12"> <local:PropertyRow x:Uid="SettingsPagePlaybackSource" Value="{x:Bind ViewModel.MediaSessionsService.CurrentMediaSourceProviderInfo.DisplayName, Mode=OneWay}" />
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto" />
<ColumnDefinition Width="*" />
</Grid.ColumnDefinitions>
<TextBlock x:Uid="SettingsPagePlaybackSource" Grid.Column="0" />
<RichTextBlock Grid.Column="1" Foreground="{ThemeResource TextFillColorSecondaryBrush}">
<Paragraph>
<Run Text="{x:Bind ViewModel.MediaSessionsService.CurrentMediaSourceProviderInfo.DisplayName, Mode=OneWay}" />
</Paragraph>
</RichTextBlock>
</Grid>
<!-- Playback source ID --> <!-- Playback source ID -->
<Grid ColumnSpacing="12"> <local:PropertyRow x:Uid="SettingsPagePlaybackSourceID" Value="{x:Bind ViewModel.MediaSessionsService.CurrentSongInfo.PlayerId, TargetNullValue=N/A, Mode=OneWay}" />
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto" />
<ColumnDefinition Width="*" />
</Grid.ColumnDefinitions>
<TextBlock x:Uid="SettingsPagePlaybackSourceID" Grid.Column="0" />
<RichTextBlock Grid.Column="1" Foreground="{ThemeResource TextFillColorSecondaryBrush}">
<Paragraph>
<Run Text="{x:Bind ViewModel.MediaSessionsService.CurrentSongInfo.PlayerId, TargetNullValue=N/A, Mode=OneWay}" />
</Paragraph>
</RichTextBlock>
</Grid>
<!-- Song title -->
<Grid ColumnSpacing="12">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto" />
<ColumnDefinition Width="*" />
</Grid.ColumnDefinitions>
<TextBlock x:Uid="LyricsSearchControlTitle" Grid.Column="0" />
<RichTextBlock Grid.Column="1" Foreground="{ThemeResource TextFillColorSecondaryBrush}">
<Paragraph>
<Run Text="{x:Bind ViewModel.MediaSessionsService.CurrentSongInfo.Title, TargetNullValue=N/A, Mode=OneWay}" />
</Paragraph>
</RichTextBlock>
</Grid>
<!-- Song artists -->
<Grid ColumnSpacing="12">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto" />
<ColumnDefinition Width="*" />
</Grid.ColumnDefinitions>
<TextBlock x:Uid="LyricsSearchControlArtist" Grid.Column="0" />
<RichTextBlock Grid.Column="1" Foreground="{ThemeResource TextFillColorSecondaryBrush}">
<Paragraph>
<Run Text="{x:Bind ViewModel.MediaSessionsService.CurrentSongInfo.DisplayArtists, TargetNullValue=N/A, Mode=OneWay}" />
</Paragraph>
</RichTextBlock>
</Grid>
<!-- Song album -->
<Grid ColumnSpacing="12">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto" />
<ColumnDefinition Width="*" />
</Grid.ColumnDefinitions>
<TextBlock x:Uid="LyricsSearchControlAlbum" Grid.Column="0" />
<RichTextBlock Grid.Column="1" Foreground="{ThemeResource TextFillColorSecondaryBrush}">
<Paragraph>
<Run Text="{x:Bind ViewModel.MediaSessionsService.CurrentSongInfo.Album, TargetNullValue=N/A, Mode=OneWay}" />
</Paragraph>
</RichTextBlock>
</Grid>
<!-- Lyrics source -->
<StackPanel Orientation="Horizontal" Spacing="12">
<TextBlock x:Uid="LyricsPageLyricsProviderPrefix" />
<HyperlinkButton
Padding="0"
Content="{x:Bind ViewModel.MediaSessionsService.CurrentLyricsSearchResult.ProviderIfFound, Mode=OneWay, Converter={StaticResource LyricsSearchProviderToDisplayNameConverter}}"
IsEnabled="{x:Bind ViewModel.MediaSessionsService.CurrentLyricsSearchResult.IsFound, Mode=OneWay}"
NavigateUri="{x:Bind ViewModel.MediaSessionsService.CurrentLyricsSearchResult.Reference, Mode=OneWay}" />
</StackPanel>
<!-- Translation source -->
<StackPanel Orientation="Horizontal" Spacing="12">
<TextBlock x:Uid="LyricsPageTranslationProviderPrefix" />
<TextBlock Foreground="{ThemeResource TextFillColorSecondaryBrush}" Text="{x:Bind ViewModel.MediaSessionsService.TranslationSearchProvider, Mode=OneWay, Converter={StaticResource TranslationSearchProviderToDisplayNameConverter}}" />
</StackPanel>
<!-- Match percentage -->
<StackPanel Orientation="Horizontal" Spacing="6">
<TextBlock x:Uid="LyricsPageMatchPercentage" />
<TextBlock Foreground="{ThemeResource TextFillColorSecondaryBrush}" Text="{x:Bind ViewModel.MediaSessionsService.CurrentLyricsSearchResult.MatchPercentage, Mode=OneWay}" />
</StackPanel>
</StackPanel> </StackPanel>
</dev:SettingsCard> </Expander>
<!-- Song info -->
<Expander
x:Uid="SettingsPageSongStatus"
HorizontalAlignment="Stretch"
HorizontalContentAlignment="Left">
<StackPanel Spacing="6">
<!-- Song title -->
<local:PropertyRow x:Uid="SettingsPageSongTitle" Value="{x:Bind ViewModel.MediaSessionsService.CurrentSongInfo.Title, TargetNullValue=N/A, Mode=OneWay}" />
<!-- Song artists -->
<local:PropertyRow x:Uid="SettingsPageArtist" Value="{x:Bind ViewModel.MediaSessionsService.CurrentSongInfo.DisplayArtists, TargetNullValue=N/A, Mode=OneWay}" />
<!-- Song album -->
<local:PropertyRow x:Uid="SettingsPageAlbum" Value="{x:Bind ViewModel.MediaSessionsService.CurrentSongInfo.Album, TargetNullValue=N/A, Mode=OneWay}" />
<!-- Song duration -->
<local:PropertyRow
x:Uid="LyricsSearchControlDurauion"
Unit="s"
Value="{x:Bind ViewModel.MediaSessionsService.CurrentSongInfo.Duration, TargetNullValue=N/A, Mode=OneWay}" />
</StackPanel>
</Expander>
<!-- Search result info -->
<Expander
x:Uid="SettingsPageSearchResultStatus"
HorizontalAlignment="Stretch"
HorizontalContentAlignment="Left">
<StackPanel Spacing="6">
<!-- Searched title -->
<local:PropertyRow x:Uid="SettingsPageSongTitle" Value="{x:Bind ViewModel.MediaSessionsService.CurrentLyricsSearchResult.Title, TargetNullValue=N/A, Mode=OneWay}" />
<!-- Searched artists -->
<local:PropertyRow x:Uid="SettingsPageArtist" Value="{x:Bind ViewModel.MediaSessionsService.CurrentLyricsSearchResult.DisplayArtists, TargetNullValue=N/A, Mode=OneWay}" />
<!-- Searched album -->
<local:PropertyRow x:Uid="SettingsPageAlbum" Value="{x:Bind ViewModel.MediaSessionsService.CurrentLyricsSearchResult.Album, TargetNullValue=N/A, Mode=OneWay}" />
<!-- Searched duration -->
<local:PropertyRow
x:Uid="LyricsSearchControlDurauion"
Unit="s"
Value="{x:Bind ViewModel.MediaSessionsService.CurrentLyricsSearchResult.Duration, TargetNullValue=N/A, Mode=OneWay}" />
<!-- Lyrics source -->
<local:PropertyRow
x:Uid="LyricsPageLyricsProviderPrefix"
Link="{x:Bind ViewModel.MediaSessionsService.CurrentLyricsSearchResult.Reference, Mode=OneWay}"
Value="{x:Bind ViewModel.MediaSessionsService.CurrentLyricsSearchResult.ProviderIfFound, Mode=OneWay, Converter={StaticResource LyricsSearchProviderToDisplayNameConverter}}" />
<!-- Translation source -->
<local:PropertyRow x:Uid="LyricsPageTranslationProviderPrefix" Value="{x:Bind ViewModel.MediaSessionsService.TranslationSearchProvider, Mode=OneWay, Converter={StaticResource TranslationSearchProviderToDisplayNameConverter}}" />
<!-- Match percentage -->
<local:PropertyRow
x:Uid="LyricsPageMatchPercentage"
Unit="%"
Value="{x:Bind ViewModel.MediaSessionsService.CurrentLyricsSearchResult.MatchPercentage, Mode=OneWay}" />
<!-- Reference -->
<local:PropertyRow x:Uid="SettingsPageReference" Value="{x:Bind ViewModel.MediaSessionsService.CurrentLyricsSearchResult.Reference, TargetNullValue=N/A, Mode=OneWay}" />
</StackPanel>
</Expander>
<dev:SettingsCard x:Uid="SettingsPageForceWordByWordEffect"> <dev:SettingsCard x:Uid="SettingsPageForceWordByWordEffect">
<ToggleSwitch IsOn="{x:Bind ViewModel.AppSettings.GeneralSettings.IsForceWordByWordEffect, Mode=TwoWay}" /> <ToggleSwitch IsOn="{x:Bind ViewModel.AppSettings.GeneralSettings.IsForceWordByWordEffect, Mode=TwoWay}" />

View File

@@ -0,0 +1,90 @@
<?xml version="1.0" encoding="utf-8" ?>
<UserControl
x:Class="BetterLyrics.WinUI3.Controls.PropertyRow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:local="using:BetterLyrics.WinUI3.Controls"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:ui="using:CommunityToolkit.WinUI"
mc:Ignorable="d">
<Grid HorizontalAlignment="Left" ColumnSpacing="12">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto" />
<ColumnDefinition Width="*" />
</Grid.ColumnDefinitions>
<TextBlock
Grid.Column="0"
VerticalAlignment="Top"
Text="{x:Bind Header, Mode=OneWay}" />
<Grid
Grid.Column="1"
VerticalAlignment="Top"
PointerEntered="OnPointerEntered"
PointerExited="OnPointerExited">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*" />
<ColumnDefinition Width="Auto" />
</Grid.ColumnDefinitions>
<Grid Grid.Column="0">
<RichTextBlock Foreground="{ThemeResource TextFillColorSecondaryBrush}" Visibility="{x:Bind TextVisibility, Mode=OneWay}">
<Paragraph>
<Run Text="{x:Bind Value, Mode=OneWay}" />
<Run Text="{x:Bind Unit, Mode=OneWay}" />
</Paragraph>
</RichTextBlock>
<HyperlinkButton
Margin="0,-2,0,0"
Padding="0"
HorizontalContentAlignment="Left"
Click="OnLinkClicked"
Content="{x:Bind Value, Mode=OneWay}"
Visibility="{x:Bind LinkVisibility, Mode=OneWay}" />
</Grid>
<Button
x:Name="CopyButton"
Grid.Column="1"
Margin="8,-2,0,0"
Padding="4"
VerticalAlignment="Top"
Click="OnCopyClicked"
Opacity="0">
<ToolTipService.ToolTip>
<TextBlock x:Uid="Copy" />
</ToolTipService.ToolTip>
<Button.OpacityTransition>
<ScalarTransition />
</Button.OpacityTransition>
<Grid>
<FontIcon
x:Name="CopyIcon"
FontFamily="{StaticResource IconFontFamily}"
FontSize="16"
Glyph="&#xE8C8;"
Opacity="1">
<FontIcon.OpacityTransition>
<ScalarTransition />
</FontIcon.OpacityTransition>
</FontIcon>
<FontIcon
x:Name="CheckIcon"
FontFamily="{StaticResource IconFontFamily}"
FontSize="16"
Glyph="&#xE73E;"
Opacity="0">
<FontIcon.OpacityTransition>
<ScalarTransition />
</FontIcon.OpacityTransition>
</FontIcon>
</Grid>
</Button>
</Grid>
</Grid>
</UserControl>

View File

@@ -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);
}
}
}
}
}

View File

@@ -2,42 +2,32 @@
using F23.StringSimilarity; using F23.StringSimilarity;
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.IO;
using System.Linq; using System.Linq;
using System.Text; using System.Text;
using System.Text.RegularExpressions;
namespace BetterLyrics.WinUI3.Helper namespace BetterLyrics.WinUI3.Helper
{ {
public static class MetadataComparer public static partial class MetadataComparer
{ {
// 权重配置 (总和 1.0)
private const double WeightTitle = 0.40; private const double WeightTitle = 0.40;
private const double WeightArtist = 0.40; private const double WeightArtist = 0.40;
private const double WeightAlbum = 0.10; private const double WeightAlbum = 0.10;
private const double WeightDuration = 0.10; private const double WeightDuration = 0.10;
// 实例化算法 (JaroWinkler 适合短字符串匹配) // JaroWinkler 适合短字符串匹配
private static readonly JaroWinkler _algo = new JaroWinkler(); private static readonly JaroWinkler _algo = new JaroWinkler();
/// <summary>
/// 计算 SongInfo 和 LyricsSearchResult 的相似度 (0-100)
/// </summary>
public static int CalculateScore(SongInfo local, LyricsSearchResult remote) public static int CalculateScore(SongInfo local, LyricsSearchResult remote)
{ {
if (local == null || remote == null) return 0; if (local == null || remote == null) return 0;
// 1. 标题相似度
double titleScore = GetStringSimilarity(local.Title, remote.Title); double titleScore = GetStringSimilarity(local.Title, remote.Title);
// 2. 艺术家相似度 (需要处理数组顺序)
double artistScore = GetArtistSimilarity(local.Artists, remote.Artists); double artistScore = GetArtistSimilarity(local.Artists, remote.Artists);
// 3. 专辑相似度
double albumScore = GetStringSimilarity(local.Album, remote.Album); double albumScore = GetStringSimilarity(local.Album, remote.Album);
// 4. 时长相似度 (基于毫秒 vs 秒的转换和容差)
double durationScore = GetDurationSimilarity(local.DurationMs, remote.Duration); double durationScore = GetDurationSimilarity(local.DurationMs, remote.Duration);
// 5. 加权汇总
double totalScore = (titleScore * WeightTitle) + double totalScore = (titleScore * WeightTitle) +
(artistScore * WeightArtist) + (artistScore * WeightArtist) +
(albumScore * WeightAlbum) + (albumScore * WeightAlbum) +
@@ -46,9 +36,31 @@ namespace BetterLyrics.WinUI3.Helper
return (int)Math.Round(totalScore * 100); 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<string>();
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) private static double GetStringSimilarity(string? s1, string? s2)
{ {
// 归一化:转小写,去空白
s1 = s1?.Trim().ToLowerInvariant() ?? ""; s1 = s1?.Trim().ToLowerInvariant() ?? "";
s2 = s2?.Trim().ToLowerInvariant() ?? ""; s2 = s2?.Trim().ToLowerInvariant() ?? "";
@@ -63,8 +75,7 @@ namespace BetterLyrics.WinUI3.Helper
if (localArtists == null || localArtists.Length == 0) return 0.0; if (localArtists == null || localArtists.Length == 0) return 0.0;
if (remoteArtists == null || remoteArtists.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 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())); 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 localSeconds = localMs / 1000.0;
double diff = Math.Abs(localSeconds - remoteSeconds.Value); double diff = Math.Abs(localSeconds - remoteSeconds.Value);
// 容差逻辑:
// 差距 <= 3秒100% 相似 // 差距 <= 3秒100% 相似
// 差距 >= 20秒0% 相似 // 差距 >= 20秒0% 相似
// 中间线性插值 // 中间线性插值
@@ -89,8 +99,24 @@ namespace BetterLyrics.WinUI3.Helper
if (diff <= PerfectTolerance) return 1.0; if (diff <= PerfectTolerance) return 1.0;
if (diff >= MaxTolerance) return 0.0; if (diff >= MaxTolerance) return 0.0;
// 线性递减公式
return 1.0 - ((diff - PerfectTolerance) / (MaxTolerance - PerfectTolerance)); 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();
} }
} }

View File

@@ -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;
using System.Net; using System.Net;
using System.Net.Http; using System.Net.Http;
@@ -67,7 +70,7 @@ namespace BetterLyrics.WinUI3.Providers
_client.DefaultRequestHeaders.Add("Accept-Language", $"{_language},en;q=0.9"); _client.DefaultRequestHeaders.Add("Accept-Language", $"{_language},en;q=0.9");
} }
public async Task<string?> GetLyricsAsync(string id) private async Task<string?> GetLyricsAsync(string id)
{ {
var apiUrl = $"https://amp-api.music.apple.com/v1/catalog/{_storefront}/songs/{id}"; var apiUrl = $"https://amp-api.music.apple.com/v1/catalog/{_storefront}/songs/{id}";
var url = apiUrl + $"?include[songs]=lyrics,syllable-lyrics&l={_language}"; var url = apiUrl + $"?include[songs]=lyrics,syllable-lyrics&l={_language}";
@@ -109,9 +112,14 @@ namespace BetterLyrics.WinUI3.Providers
return null; return null;
} }
public async Task<string> SearchSongInfoAsync(string artist, string title) public async Task<LyricsSearchResult> 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 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 url = apiUrl + $"?term={WebUtility.UrlEncode(query)}&types=songs&limit=1&l={_language}";
var resp = await _client.GetStringAsync(url); 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) if (results.TryGetProperty("songs", out var songs) && songs.GetProperty("data").GetArrayLength() > 0)
{ {
var song = songs.GetProperty("data")[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;
} }
} }
} }

View File

@@ -205,8 +205,6 @@ namespace BetterLyrics.WinUI3.Services.LyricsSearchService
try try
{ {
LyricsFormat lyricsFormat = provider.GetLyricsFormat();
// Check cache first if allowed // Check cache first if allowed
if (checkCache && provider.IsRemote()) if (checkCache && provider.IsRemote())
{ {
@@ -226,7 +224,7 @@ namespace BetterLyrics.WinUI3.Services.LyricsSearchService
} }
else else
{ {
lyricsSearchResult = await SearchFile(songInfo, lyricsFormat); lyricsSearchResult = await SearchFile(songInfo, provider.GetLyricsFormat());
} }
} }
else else
@@ -258,7 +256,6 @@ namespace BetterLyrics.WinUI3.Services.LyricsSearchService
if (token.IsCancellationRequested) if (token.IsCancellationRequested)
{ {
lyricsSearchResult.MatchPercentage = MetadataComparer.CalculateScore(songInfo, lyricsSearchResult);
return lyricsSearchResult; return lyricsSearchResult;
} }
@@ -267,8 +264,6 @@ namespace BetterLyrics.WinUI3.Services.LyricsSearchService
{ {
} }
lyricsSearchResult.MatchPercentage = MetadataComparer.CalculateScore(songInfo, lyricsSearchResult);
if (lyricsSearchResult.IsFound) if (lyricsSearchResult.IsFound)
{ {
if (provider.IsRemote()) if (provider.IsRemote())
@@ -282,6 +277,9 @@ namespace BetterLyrics.WinUI3.Services.LyricsSearchService
private async Task<LyricsSearchResult> SearchFile(SongInfo songInfo, LyricsFormat format) private async Task<LyricsSearchResult> SearchFile(SongInfo songInfo, LyricsFormat format)
{ {
int maxScore = 0;
string? bestFile = null;
var lyricsSearchResult = new LyricsSearchResult(); var lyricsSearchResult = new LyricsSearchResult();
if (format.ToLyricsSearchProvider() is LyricsSearchProvider lyricsSearchProvider) 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()}")) foreach (var file in DirectoryHelper.GetAllFiles(folder.Path, $"*{format.ToFileExtension()}"))
{ {
var fileName = Path.GetFileNameWithoutExtension(file); int score = MetadataComparer.CalculateScore(songInfo, file);
if (StringHelper.IsSwitchableNormalizedMatch(fileName, songInfo.Title, songInfo.DisplayArtists) || songInfo.LinkedFileName == fileName) if (score > maxScore)
{ {
string? raw = await File.ReadAllTextAsync(file, FileHelper.GetEncoding(file)); bestFile = file;
if (raw != null) maxScore = score;
{
lyricsSearchResult.Raw = raw;
lyricsSearchResult.CopyFromSongInfo(songInfo);
lyricsSearchResult.Reference = file;
return lyricsSearchResult;
}
} }
} }
} }
@@ -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; return lyricsSearchResult;
} }
private LyricsSearchResult SearchEmbedded(SongInfo songInfo) private LyricsSearchResult SearchEmbedded(SongInfo songInfo)
{ {
int maxScore = 0;
string? bestFile = null;
var lyricsSearchResult = new LyricsSearchResult var lyricsSearchResult = new LyricsSearchResult
{ {
Provider = LyricsSearchProvider.LocalMusicFile, Provider = LyricsSearchProvider.LocalMusicFile,
@@ -336,24 +343,39 @@ namespace BetterLyrics.WinUI3.Services.LyricsSearchService
if (FileHelper.MusicExtensions.Contains(Path.GetExtension(file))) if (FileHelper.MusicExtensions.Contains(Path.GetExtension(file)))
{ {
var track = new Track(file); var track = new Track(file);
if ((songInfo.Album != "" && track.Title == songInfo.Title && track.Artist == songInfo.DisplayArtists && track.Album == songInfo.Album) int score = MetadataComparer.CalculateScore(songInfo, new LyricsSearchResult
|| (songInfo.Album == "" && track.Title == songInfo.Title && track.Artist == songInfo.DisplayArtists)
|| (songInfo.Album == "" && StringHelper.IsSwitchableNormalizedMatch(Path.GetFileNameWithoutExtension(file), songInfo.Title, songInfo.DisplayArtists)))
{ {
var plain = track.GetRawLyrics(); Title = track.Title,
if (!plain.IsNullOrEmpty()) Artists = track.Artist.Split(ATL.Settings.DisplayValueSeparator),
{ Album = track.Album,
lyricsSearchResult.Raw = plain; Duration = track.Duration
lyricsSearchResult.CopyFromSongInfo(songInfo); });
lyricsSearchResult.Reference = file;
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; return lyricsSearchResult;
} }
@@ -425,6 +447,8 @@ namespace BetterLyrics.WinUI3.Services.LyricsSearchService
catch { } catch { }
} }
lyricsSearchResult.MatchPercentage = MetadataComparer.CalculateScore(songInfo, lyricsSearchResult);
if (string.IsNullOrWhiteSpace(rawLyricFile)) if (string.IsNullOrWhiteSpace(rawLyricFile))
{ {
return lyricsSearchResult; return lyricsSearchResult;
@@ -503,6 +527,8 @@ namespace BetterLyrics.WinUI3.Services.LyricsSearchService
lyricsSearchResult.Reference = url; lyricsSearchResult.Reference = url;
lyricsSearchResult.MatchPercentage = MetadataComparer.CalculateScore(songInfo, lyricsSearchResult);
return lyricsSearchResult; return lyricsSearchResult;
} }
@@ -602,26 +628,23 @@ namespace BetterLyrics.WinUI3.Services.LyricsSearchService
lyricsSearchResult.Album = result?.Album; lyricsSearchResult.Album = result?.Album;
lyricsSearchResult.Duration = result?.DurationMs / 1000; lyricsSearchResult.Duration = result?.DurationMs / 1000;
lyricsSearchResult.MatchPercentage = MetadataComparer.CalculateScore(songInfo, lyricsSearchResult);
return lyricsSearchResult; return lyricsSearchResult;
} }
private async Task<LyricsSearchResult> SearchAppleMusicAsync(SongInfo songInfo) private async Task<LyricsSearchResult> SearchAppleMusicAsync(SongInfo songInfo)
{ {
var lyricsSearchResult = new LyricsSearchResult LyricsSearchResult lyricsSearchResult = new()
{ {
Provider = LyricsSearchProvider.AppleMusic, Provider = LyricsSearchProvider.AppleMusic
}; };
_logger.LogInformation("SearchAppleMusicAsync");
if (await _appleMusic.InitAsync()) if (await _appleMusic.InitAsync())
{ {
string id = await _appleMusic.SearchSongInfoAsync(songInfo.DisplayArtists, songInfo.Title); lyricsSearchResult = await _appleMusic.SearchSongInfoAsync(songInfo);
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}";
} }
return lyricsSearchResult; return lyricsSearchResult;

View File

@@ -144,6 +144,9 @@
<data name="Cancel" xml:space="preserve"> <data name="Cancel" xml:space="preserve">
<value>Cancel</value> <value>Cancel</value>
</data> </data>
<data name="Copy.Text" xml:space="preserve">
<value>Copy</value>
</data>
<data name="CreatePlaylistSuccessfully" xml:space="preserve"> <data name="CreatePlaylistSuccessfully" xml:space="preserve">
<value>Playlist was created successfully</value> <value>Playlist was created successfully</value>
</data> </data>
@@ -228,7 +231,7 @@
<data name="LyricsNotFound" xml:space="preserve"> <data name="LyricsNotFound" xml:space="preserve">
<value>Lyrics not found</value> <value>Lyrics not found</value>
</data> </data>
<data name="LyricsPageLyricsProviderPrefix.Text" xml:space="preserve"> <data name="LyricsPageLyricsProviderPrefix.Header" xml:space="preserve">
<value>Lyrics provider</value> <value>Lyrics provider</value>
</data> </data>
<data name="LyricsPageLyricsSearchButtonToolTip.Content" xml:space="preserve"> <data name="LyricsPageLyricsSearchButtonToolTip.Content" xml:space="preserve">
@@ -237,7 +240,7 @@
<data name="LyricsPageLyricsSettingsButtonToolTip.Content" xml:space="preserve"> <data name="LyricsPageLyricsSettingsButtonToolTip.Content" xml:space="preserve">
<value>Lyrics Window Management Shortcut Settings</value> <value>Lyrics Window Management Shortcut Settings</value>
</data> </data>
<data name="LyricsPageMatchPercentage.Text" xml:space="preserve"> <data name="LyricsPageMatchPercentage.Header" xml:space="preserve">
<value>Match percentage</value> <value>Match percentage</value>
</data> </data>
<data name="LyricsPagePlaybackSourceButtonToolTip.Content" xml:space="preserve"> <data name="LyricsPagePlaybackSourceButtonToolTip.Content" xml:space="preserve">
@@ -264,7 +267,7 @@
<data name="LyricsPageTranslationOnly.Header" xml:space="preserve"> <data name="LyricsPageTranslationOnly.Header" xml:space="preserve">
<value>Show translation only</value> <value>Show translation only</value>
</data> </data>
<data name="LyricsPageTranslationProviderPrefix.Text" xml:space="preserve"> <data name="LyricsPageTranslationProviderPrefix.Header" xml:space="preserve">
<value>Translation provider</value> <value>Translation provider</value>
</data> </data>
<data name="LyricsSearchControlAlbum.Text" xml:space="preserve"> <data name="LyricsSearchControlAlbum.Text" xml:space="preserve">
@@ -273,7 +276,7 @@
<data name="LyricsSearchControlArtist.Text" xml:space="preserve"> <data name="LyricsSearchControlArtist.Text" xml:space="preserve">
<value>Artist</value> <value>Artist</value>
</data> </data>
<data name="LyricsSearchControlDurauion.Text" xml:space="preserve"> <data name="LyricsSearchControlDurauion.Header" xml:space="preserve">
<value>Duration</value> <value>Duration</value>
</data> </data>
<data name="LyricsSearchControlHelp.Text" xml:space="preserve"> <data name="LyricsSearchControlHelp.Text" xml:space="preserve">
@@ -306,9 +309,6 @@
<data name="LyricsSearchControlTargetSearchProvider.Header" xml:space="preserve"> <data name="LyricsSearchControlTargetSearchProvider.Header" xml:space="preserve">
<value>Target lyrics search provider</value> <value>Target lyrics search provider</value>
</data> </data>
<data name="LyricsSearchControlTitle.Text" xml:space="preserve">
<value>Title</value>
</data>
<data name="LyricsSearchPageTitle" xml:space="preserve"> <data name="LyricsSearchPageTitle" xml:space="preserve">
<value>Lyrics search - BetterLyrics</value> <value>Lyrics search - BetterLyrics</value>
</data> </data>
@@ -565,6 +565,9 @@ If you encounter any problems, please go to the Settings page, About tab, and vi
<data name="SettingsPageAdvanced.Text" xml:space="preserve"> <data name="SettingsPageAdvanced.Text" xml:space="preserve">
<value>Advanced options</value> <value>Advanced options</value>
</data> </data>
<data name="SettingsPageAlbum.Header" xml:space="preserve">
<value>Album</value>
</data>
<data name="SettingsPageAlbumArt.Text" xml:space="preserve"> <data name="SettingsPageAlbumArt.Text" xml:space="preserve">
<value>Album art</value> <value>Album art</value>
</data> </data>
@@ -610,6 +613,9 @@ If you encounter any problems, please go to the Settings page, About tab, and vi
<data name="SettingsPageApply.Content" xml:space="preserve"> <data name="SettingsPageApply.Content" xml:space="preserve">
<value>Apply</value> <value>Apply</value>
</data> </data>
<data name="SettingsPageArtist.Header" xml:space="preserve">
<value>Artist</value>
</data>
<data name="SettingsPageAutoAdjust.Header" xml:space="preserve"> <data name="SettingsPageAutoAdjust.Header" xml:space="preserve">
<value>Automatic adjustment</value> <value>Automatic adjustment</value>
</data> </data>
@@ -1189,12 +1195,15 @@ If you encounter any problems, please go to the Settings page, About tab, and vi
<data name="SettingsPagePlaybackShortcut.Text" xml:space="preserve"> <data name="SettingsPagePlaybackShortcut.Text" xml:space="preserve">
<value>Play</value> <value>Play</value>
</data> </data>
<data name="SettingsPagePlaybackSource.Text" xml:space="preserve"> <data name="SettingsPagePlaybackSource.Header" xml:space="preserve">
<value>Playback source</value> <value>Playback source</value>
</data> </data>
<data name="SettingsPagePlaybackSourceID.Text" xml:space="preserve"> <data name="SettingsPagePlaybackSourceID.Header" xml:space="preserve">
<value>Playback source ID</value> <value>Playback source ID</value>
</data> </data>
<data name="SettingsPagePlaybackStatus.Header" xml:space="preserve">
<value>Current playback source</value>
</data>
<data name="SettingsPagePlayingMockMusicButton.Content" xml:space="preserve"> <data name="SettingsPagePlayingMockMusicButton.Content" xml:space="preserve">
<value>Play "Cut To The Feeling" on "soundcloud.com"</value> <value>Play "Cut To The Feeling" on "soundcloud.com"</value>
</data> </data>
@@ -1219,6 +1228,9 @@ If you encounter any problems, please go to the Settings page, About tab, and vi
<data name="SettingsPageRecordedWindowStatus.Text" xml:space="preserve"> <data name="SettingsPageRecordedWindowStatus.Text" xml:space="preserve">
<value>Recorded window status</value> <value>Recorded window status</value>
</data> </data>
<data name="SettingsPageReference.Header" xml:space="preserve">
<value>Reference link</value>
</data>
<data name="SettingsPageRemoveInfo.Message" xml:space="preserve"> <data name="SettingsPageRemoveInfo.Message" xml:space="preserve">
<value>Original files and folders in this path will not be deleted when removing it from this app</value> <value>Original files and folders in this path will not be deleted when removing it from this app</value>
</data> </data>
@@ -1258,6 +1270,9 @@ If you encounter any problems, please go to the Settings page, About tab, and vi
<data name="SettingsPageScrollTopDuration.Header" xml:space="preserve"> <data name="SettingsPageScrollTopDuration.Header" xml:space="preserve">
<value>The duration of the first line</value> <value>The duration of the first line</value>
</data> </data>
<data name="SettingsPageSearchResultStatus.Header" xml:space="preserve">
<value>Current lyrics search result</value>
</data>
<data name="SettingsPageServerTestButton.Content" xml:space="preserve"> <data name="SettingsPageServerTestButton.Content" xml:space="preserve">
<value>Test server</value> <value>Test server</value>
</data> </data>
@@ -1321,6 +1336,12 @@ If you encounter any problems, please go to the Settings page, About tab, and vi
<data name="SettingsPageSongInfoRight.Content" xml:space="preserve"> <data name="SettingsPageSongInfoRight.Content" xml:space="preserve">
<value>Right</value> <value>Right</value>
</data> </data>
<data name="SettingsPageSongStatus.Header" xml:space="preserve">
<value>Current song</value>
</data>
<data name="SettingsPageSongTitle.Header" xml:space="preserve">
<value>Title</value>
</data>
<data name="SettingsPageSpectrumLayer.Header" xml:space="preserve"> <data name="SettingsPageSpectrumLayer.Header" xml:space="preserve">
<value>[Experimental] Spectrum Layer</value> <value>[Experimental] Spectrum Layer</value>
</data> </data>

View File

@@ -144,6 +144,9 @@
<data name="Cancel" xml:space="preserve"> <data name="Cancel" xml:space="preserve">
<value>キャンセル</value> <value>キャンセル</value>
</data> </data>
<data name="Copy.Text" xml:space="preserve">
<value>コピー</value>
</data>
<data name="CreatePlaylistSuccessfully" xml:space="preserve"> <data name="CreatePlaylistSuccessfully" xml:space="preserve">
<value>正常に作成されました</value> <value>正常に作成されました</value>
</data> </data>
@@ -228,7 +231,7 @@
<data name="LyricsNotFound" xml:space="preserve"> <data name="LyricsNotFound" xml:space="preserve">
<value>歌詞が見つかりません</value> <value>歌詞が見つかりません</value>
</data> </data>
<data name="LyricsPageLyricsProviderPrefix.Text" xml:space="preserve"> <data name="LyricsPageLyricsProviderPrefix.Header" xml:space="preserve">
<value>歌詞プロバイダー</value> <value>歌詞プロバイダー</value>
</data> </data>
<data name="LyricsPageLyricsSearchButtonToolTip.Content" xml:space="preserve"> <data name="LyricsPageLyricsSearchButtonToolTip.Content" xml:space="preserve">
@@ -237,7 +240,7 @@
<data name="LyricsPageLyricsSettingsButtonToolTip.Content" xml:space="preserve"> <data name="LyricsPageLyricsSettingsButtonToolTip.Content" xml:space="preserve">
<value>歌詞ウィンドウ管理ショートカット設定</value> <value>歌詞ウィンドウ管理ショートカット設定</value>
</data> </data>
<data name="LyricsPageMatchPercentage.Text" xml:space="preserve"> <data name="LyricsPageMatchPercentage.Header" xml:space="preserve">
<value>マッチ率</value> <value>マッチ率</value>
</data> </data>
<data name="LyricsPagePlaybackSourceButtonToolTip.Content" xml:space="preserve"> <data name="LyricsPagePlaybackSourceButtonToolTip.Content" xml:space="preserve">
@@ -264,7 +267,7 @@
<data name="LyricsPageTranslationOnly.Header" xml:space="preserve"> <data name="LyricsPageTranslationOnly.Header" xml:space="preserve">
<value>翻訳のみを表示します</value> <value>翻訳のみを表示します</value>
</data> </data>
<data name="LyricsPageTranslationProviderPrefix.Text" xml:space="preserve"> <data name="LyricsPageTranslationProviderPrefix.Header" xml:space="preserve">
<value>翻訳プロバイダー</value> <value>翻訳プロバイダー</value>
</data> </data>
<data name="LyricsSearchControlAlbum.Text" xml:space="preserve"> <data name="LyricsSearchControlAlbum.Text" xml:space="preserve">
@@ -273,7 +276,7 @@
<data name="LyricsSearchControlArtist.Text" xml:space="preserve"> <data name="LyricsSearchControlArtist.Text" xml:space="preserve">
<value>アーティスト</value> <value>アーティスト</value>
</data> </data>
<data name="LyricsSearchControlDurauion.Text" xml:space="preserve"> <data name="LyricsSearchControlDurauion.Header" xml:space="preserve">
<value>間隔</value> <value>間隔</value>
</data> </data>
<data name="LyricsSearchControlHelp.Text" xml:space="preserve"> <data name="LyricsSearchControlHelp.Text" xml:space="preserve">
@@ -306,9 +309,6 @@
<data name="LyricsSearchControlTargetSearchProvider.Header" xml:space="preserve"> <data name="LyricsSearchControlTargetSearchProvider.Header" xml:space="preserve">
<value>ターゲット歌詞検索プロバイダー</value> <value>ターゲット歌詞検索プロバイダー</value>
</data> </data>
<data name="LyricsSearchControlTitle.Text" xml:space="preserve">
<value>タイトル</value>
</data>
<data name="LyricsSearchPageTitle" xml:space="preserve"> <data name="LyricsSearchPageTitle" xml:space="preserve">
<value>歌詞検索 - BetterLyrics</value> <value>歌詞検索 - BetterLyrics</value>
</data> </data>
@@ -565,6 +565,9 @@
<data name="SettingsPageAdvanced.Text" xml:space="preserve"> <data name="SettingsPageAdvanced.Text" xml:space="preserve">
<value>高度なオプション</value> <value>高度なオプション</value>
</data> </data>
<data name="SettingsPageAlbum.Header" xml:space="preserve">
<value>アルバム</value>
</data>
<data name="SettingsPageAlbumArt.Text" xml:space="preserve"> <data name="SettingsPageAlbumArt.Text" xml:space="preserve">
<value>アルバムアート</value> <value>アルバムアート</value>
</data> </data>
@@ -610,6 +613,9 @@
<data name="SettingsPageApply.Content" xml:space="preserve"> <data name="SettingsPageApply.Content" xml:space="preserve">
<value>適用する</value> <value>適用する</value>
</data> </data>
<data name="SettingsPageArtist.Header" xml:space="preserve">
<value>アーティスト</value>
</data>
<data name="SettingsPageAutoAdjust.Header" xml:space="preserve"> <data name="SettingsPageAutoAdjust.Header" xml:space="preserve">
<value>自動調整</value> <value>自動調整</value>
</data> </data>
@@ -1189,12 +1195,15 @@
<data name="SettingsPagePlaybackShortcut.Text" xml:space="preserve"> <data name="SettingsPagePlaybackShortcut.Text" xml:space="preserve">
<value>遊ぶ</value> <value>遊ぶ</value>
</data> </data>
<data name="SettingsPagePlaybackSource.Text" xml:space="preserve"> <data name="SettingsPagePlaybackSource.Header" xml:space="preserve">
<value>再生ソース</value> <value>再生ソース</value>
</data> </data>
<data name="SettingsPagePlaybackSourceID.Text" xml:space="preserve"> <data name="SettingsPagePlaybackSourceID.Header" xml:space="preserve">
<value>再生ソースID</value> <value>再生ソースID</value>
</data> </data>
<data name="SettingsPagePlaybackStatus.Header" xml:space="preserve">
<value>現在の再生ソース</value>
</data>
<data name="SettingsPagePlayingMockMusicButton.Content" xml:space="preserve"> <data name="SettingsPagePlayingMockMusicButton.Content" xml:space="preserve">
<value>「SoundCloud.com」で「Cut to the Feeling」を再生する</value> <value>「SoundCloud.com」で「Cut to the Feeling」を再生する</value>
</data> </data>
@@ -1219,6 +1228,9 @@
<data name="SettingsPageRecordedWindowStatus.Text" xml:space="preserve"> <data name="SettingsPageRecordedWindowStatus.Text" xml:space="preserve">
<value>記録されたウィンドウステータス</value> <value>記録されたウィンドウステータス</value>
</data> </data>
<data name="SettingsPageReference.Header" xml:space="preserve">
<value>参照リンク</value>
</data>
<data name="SettingsPageRemoveInfo.Message" xml:space="preserve"> <data name="SettingsPageRemoveInfo.Message" xml:space="preserve">
<value>このパスの元のファイルとフォルダーは、このアプリから削除するときに削除されません</value> <value>このパスの元のファイルとフォルダーは、このアプリから削除するときに削除されません</value>
</data> </data>
@@ -1258,6 +1270,9 @@
<data name="SettingsPageScrollTopDuration.Header" xml:space="preserve"> <data name="SettingsPageScrollTopDuration.Header" xml:space="preserve">
<value>最初の行の期間</value> <value>最初の行の期間</value>
</data> </data>
<data name="SettingsPageSearchResultStatus.Header" xml:space="preserve">
<value>現在の歌詞検索結果</value>
</data>
<data name="SettingsPageServerTestButton.Content" xml:space="preserve"> <data name="SettingsPageServerTestButton.Content" xml:space="preserve">
<value>テストサーバー</value> <value>テストサーバー</value>
</data> </data>
@@ -1321,6 +1336,12 @@
<data name="SettingsPageSongInfoRight.Content" xml:space="preserve"> <data name="SettingsPageSongInfoRight.Content" xml:space="preserve">
<value>右</value> <value>右</value>
</data> </data>
<data name="SettingsPageSongStatus.Header" xml:space="preserve">
<value>現在の曲です</value>
</data>
<data name="SettingsPageSongTitle.Header" xml:space="preserve">
<value>タイトル</value>
</data>
<data name="SettingsPageSpectrumLayer.Header" xml:space="preserve"> <data name="SettingsPageSpectrumLayer.Header" xml:space="preserve">
<value>[実験的] スペクトラムレイヤー</value> <value>[実験的] スペクトラムレイヤー</value>
</data> </data>

View File

@@ -144,6 +144,9 @@
<data name="Cancel" xml:space="preserve"> <data name="Cancel" xml:space="preserve">
<value>취소</value> <value>취소</value>
</data> </data>
<data name="Copy.Text" xml:space="preserve">
<value>접수</value>
</data>
<data name="CreatePlaylistSuccessfully" xml:space="preserve"> <data name="CreatePlaylistSuccessfully" xml:space="preserve">
<value>재생 목록이 성공적으로 생성되었습니다</value> <value>재생 목록이 성공적으로 생성되었습니다</value>
</data> </data>
@@ -228,7 +231,7 @@
<data name="LyricsNotFound" xml:space="preserve"> <data name="LyricsNotFound" xml:space="preserve">
<value>가사를 찾을 수 없습니다</value> <value>가사를 찾을 수 없습니다</value>
</data> </data>
<data name="LyricsPageLyricsProviderPrefix.Text" xml:space="preserve"> <data name="LyricsPageLyricsProviderPrefix.Header" xml:space="preserve">
<value>가사 제공자</value> <value>가사 제공자</value>
</data> </data>
<data name="LyricsPageLyricsSearchButtonToolTip.Content" xml:space="preserve"> <data name="LyricsPageLyricsSearchButtonToolTip.Content" xml:space="preserve">
@@ -237,7 +240,7 @@
<data name="LyricsPageLyricsSettingsButtonToolTip.Content" xml:space="preserve"> <data name="LyricsPageLyricsSettingsButtonToolTip.Content" xml:space="preserve">
<value>가사 창 관리 바로 가기 설정</value> <value>가사 창 관리 바로 가기 설정</value>
</data> </data>
<data name="LyricsPageMatchPercentage.Text" xml:space="preserve"> <data name="LyricsPageMatchPercentage.Header" xml:space="preserve">
<value>매치 퍼센트</value> <value>매치 퍼센트</value>
</data> </data>
<data name="LyricsPagePlaybackSourceButtonToolTip.Content" xml:space="preserve"> <data name="LyricsPagePlaybackSourceButtonToolTip.Content" xml:space="preserve">
@@ -264,7 +267,7 @@
<data name="LyricsPageTranslationOnly.Header" xml:space="preserve"> <data name="LyricsPageTranslationOnly.Header" xml:space="preserve">
<value>번역 만 표시하십시오</value> <value>번역 만 표시하십시오</value>
</data> </data>
<data name="LyricsPageTranslationProviderPrefix.Text" xml:space="preserve"> <data name="LyricsPageTranslationProviderPrefix.Header" xml:space="preserve">
<value>번역 제공자</value> <value>번역 제공자</value>
</data> </data>
<data name="LyricsSearchControlAlbum.Text" xml:space="preserve"> <data name="LyricsSearchControlAlbum.Text" xml:space="preserve">
@@ -273,7 +276,7 @@
<data name="LyricsSearchControlArtist.Text" xml:space="preserve"> <data name="LyricsSearchControlArtist.Text" xml:space="preserve">
<value>아티스트</value> <value>아티스트</value>
</data> </data>
<data name="LyricsSearchControlDurauion.Text" xml:space="preserve"> <data name="LyricsSearchControlDurauion.Header" xml:space="preserve">
<value>지속</value> <value>지속</value>
</data> </data>
<data name="LyricsSearchControlHelp.Text" xml:space="preserve"> <data name="LyricsSearchControlHelp.Text" xml:space="preserve">
@@ -306,9 +309,6 @@
<data name="LyricsSearchControlTargetSearchProvider.Header" xml:space="preserve"> <data name="LyricsSearchControlTargetSearchProvider.Header" xml:space="preserve">
<value>가사 검색 공급자를 타겟팅하십시오</value> <value>가사 검색 공급자를 타겟팅하십시오</value>
</data> </data>
<data name="LyricsSearchControlTitle.Text" xml:space="preserve">
<value>제목</value>
</data>
<data name="LyricsSearchPageTitle" xml:space="preserve"> <data name="LyricsSearchPageTitle" xml:space="preserve">
<value>가사 검색 - BetterLyrics</value> <value>가사 검색 - BetterLyrics</value>
</data> </data>
@@ -565,6 +565,9 @@
<data name="SettingsPageAdvanced.Text" xml:space="preserve"> <data name="SettingsPageAdvanced.Text" xml:space="preserve">
<value>고급 옵션</value> <value>고급 옵션</value>
</data> </data>
<data name="SettingsPageAlbum.Header" xml:space="preserve">
<value>앨범</value>
</data>
<data name="SettingsPageAlbumArt.Text" xml:space="preserve"> <data name="SettingsPageAlbumArt.Text" xml:space="preserve">
<value>앨범 아트</value> <value>앨범 아트</value>
</data> </data>
@@ -610,6 +613,9 @@
<data name="SettingsPageApply.Content" xml:space="preserve"> <data name="SettingsPageApply.Content" xml:space="preserve">
<value>적용하다</value> <value>적용하다</value>
</data> </data>
<data name="SettingsPageArtist.Header" xml:space="preserve">
<value>아티스트</value>
</data>
<data name="SettingsPageAutoAdjust.Header" xml:space="preserve"> <data name="SettingsPageAutoAdjust.Header" xml:space="preserve">
<value>자동 조정</value> <value>자동 조정</value>
</data> </data>
@@ -1189,12 +1195,15 @@
<data name="SettingsPagePlaybackShortcut.Text" xml:space="preserve"> <data name="SettingsPagePlaybackShortcut.Text" xml:space="preserve">
<value>놀다</value> <value>놀다</value>
</data> </data>
<data name="SettingsPagePlaybackSource.Text" xml:space="preserve"> <data name="SettingsPagePlaybackSource.Header" xml:space="preserve">
<value>재생 소스</value> <value>재생 소스</value>
</data> </data>
<data name="SettingsPagePlaybackSourceID.Text" xml:space="preserve"> <data name="SettingsPagePlaybackSourceID.Header" xml:space="preserve">
<value>재생 소스 ID</value> <value>재생 소스 ID</value>
</data> </data>
<data name="SettingsPagePlaybackStatus.Header" xml:space="preserve">
<value>현재 재생 소스</value>
</data>
<data name="SettingsPagePlayingMockMusicButton.Content" xml:space="preserve"> <data name="SettingsPagePlayingMockMusicButton.Content" xml:space="preserve">
<value>"soundcloud.com"에서 "Fut to the Feeling"을 재생하십시오.</value> <value>"soundcloud.com"에서 "Fut to the Feeling"을 재생하십시오.</value>
</data> </data>
@@ -1219,6 +1228,9 @@
<data name="SettingsPageRecordedWindowStatus.Text" xml:space="preserve"> <data name="SettingsPageRecordedWindowStatus.Text" xml:space="preserve">
<value>기록 된 창 상태</value> <value>기록 된 창 상태</value>
</data> </data>
<data name="SettingsPageReference.Header" xml:space="preserve">
<value>참고문헌</value>
</data>
<data name="SettingsPageRemoveInfo.Message" xml:space="preserve"> <data name="SettingsPageRemoveInfo.Message" xml:space="preserve">
<value>이 경로의 원본 파일과 폴더는이 앱에서 제거 할 때 삭제되지 않습니다.</value> <value>이 경로의 원본 파일과 폴더는이 앱에서 제거 할 때 삭제되지 않습니다.</value>
</data> </data>
@@ -1258,6 +1270,9 @@
<data name="SettingsPageScrollTopDuration.Header" xml:space="preserve"> <data name="SettingsPageScrollTopDuration.Header" xml:space="preserve">
<value>첫 번째 줄의 기간</value> <value>첫 번째 줄의 기간</value>
</data> </data>
<data name="SettingsPageSearchResultStatus.Header" xml:space="preserve">
<value>현재 가사 검색 결과</value>
</data>
<data name="SettingsPageServerTestButton.Content" xml:space="preserve"> <data name="SettingsPageServerTestButton.Content" xml:space="preserve">
<value>테스트 서버</value> <value>테스트 서버</value>
</data> </data>
@@ -1321,6 +1336,12 @@
<data name="SettingsPageSongInfoRight.Content" xml:space="preserve"> <data name="SettingsPageSongInfoRight.Content" xml:space="preserve">
<value>오른쪽</value> <value>오른쪽</value>
</data> </data>
<data name="SettingsPageSongStatus.Header" xml:space="preserve">
<value>현재 노래</value>
</data>
<data name="SettingsPageSongTitle.Header" xml:space="preserve">
<value>제목</value>
</data>
<data name="SettingsPageSpectrumLayer.Header" xml:space="preserve"> <data name="SettingsPageSpectrumLayer.Header" xml:space="preserve">
<value>[실험] 스펙트럼 레이어</value> <value>[실험] 스펙트럼 레이어</value>
</data> </data>

View File

@@ -144,6 +144,9 @@
<data name="Cancel" xml:space="preserve"> <data name="Cancel" xml:space="preserve">
<value>取消</value> <value>取消</value>
</data> </data>
<data name="Copy.Text" xml:space="preserve">
<value>拷贝</value>
</data>
<data name="CreatePlaylistSuccessfully" xml:space="preserve"> <data name="CreatePlaylistSuccessfully" xml:space="preserve">
<value>播放列表创建成功</value> <value>播放列表创建成功</value>
</data> </data>
@@ -228,7 +231,7 @@
<data name="LyricsNotFound" xml:space="preserve"> <data name="LyricsNotFound" xml:space="preserve">
<value>未找到歌词</value> <value>未找到歌词</value>
</data> </data>
<data name="LyricsPageLyricsProviderPrefix.Text" xml:space="preserve"> <data name="LyricsPageLyricsProviderPrefix.Header" xml:space="preserve">
<value>歌词来源</value> <value>歌词来源</value>
</data> </data>
<data name="LyricsPageLyricsSearchButtonToolTip.Content" xml:space="preserve"> <data name="LyricsPageLyricsSearchButtonToolTip.Content" xml:space="preserve">
@@ -237,7 +240,7 @@
<data name="LyricsPageLyricsSettingsButtonToolTip.Content" xml:space="preserve"> <data name="LyricsPageLyricsSettingsButtonToolTip.Content" xml:space="preserve">
<value>歌词窗口管理快捷设置</value> <value>歌词窗口管理快捷设置</value>
</data> </data>
<data name="LyricsPageMatchPercentage.Text" xml:space="preserve"> <data name="LyricsPageMatchPercentage.Header" xml:space="preserve">
<value>匹配百分比</value> <value>匹配百分比</value>
</data> </data>
<data name="LyricsPagePlaybackSourceButtonToolTip.Content" xml:space="preserve"> <data name="LyricsPagePlaybackSourceButtonToolTip.Content" xml:space="preserve">
@@ -264,7 +267,7 @@
<data name="LyricsPageTranslationOnly.Header" xml:space="preserve"> <data name="LyricsPageTranslationOnly.Header" xml:space="preserve">
<value>仅显示翻译</value> <value>仅显示翻译</value>
</data> </data>
<data name="LyricsPageTranslationProviderPrefix.Text" xml:space="preserve"> <data name="LyricsPageTranslationProviderPrefix.Header" xml:space="preserve">
<value>翻译来源</value> <value>翻译来源</value>
</data> </data>
<data name="LyricsSearchControlAlbum.Text" xml:space="preserve"> <data name="LyricsSearchControlAlbum.Text" xml:space="preserve">
@@ -273,7 +276,7 @@
<data name="LyricsSearchControlArtist.Text" xml:space="preserve"> <data name="LyricsSearchControlArtist.Text" xml:space="preserve">
<value>艺术家</value> <value>艺术家</value>
</data> </data>
<data name="LyricsSearchControlDurauion.Text" xml:space="preserve"> <data name="LyricsSearchControlDurauion.Header" xml:space="preserve">
<value>时长</value> <value>时长</value>
</data> </data>
<data name="LyricsSearchControlHelp.Text" xml:space="preserve"> <data name="LyricsSearchControlHelp.Text" xml:space="preserve">
@@ -306,9 +309,6 @@
<data name="LyricsSearchControlTargetSearchProvider.Header" xml:space="preserve"> <data name="LyricsSearchControlTargetSearchProvider.Header" xml:space="preserve">
<value>目标歌词搜索提供商</value> <value>目标歌词搜索提供商</value>
</data> </data>
<data name="LyricsSearchControlTitle.Text" xml:space="preserve">
<value>标题</value>
</data>
<data name="LyricsSearchPageTitle" xml:space="preserve"> <data name="LyricsSearchPageTitle" xml:space="preserve">
<value>歌词搜索 - BetterLyrics</value> <value>歌词搜索 - BetterLyrics</value>
</data> </data>
@@ -565,6 +565,9 @@
<data name="SettingsPageAdvanced.Text" xml:space="preserve"> <data name="SettingsPageAdvanced.Text" xml:space="preserve">
<value>高级选项</value> <value>高级选项</value>
</data> </data>
<data name="SettingsPageAlbum.Header" xml:space="preserve">
<value>专辑</value>
</data>
<data name="SettingsPageAlbumArt.Text" xml:space="preserve"> <data name="SettingsPageAlbumArt.Text" xml:space="preserve">
<value>专辑</value> <value>专辑</value>
</data> </data>
@@ -610,6 +613,9 @@
<data name="SettingsPageApply.Content" xml:space="preserve"> <data name="SettingsPageApply.Content" xml:space="preserve">
<value>应用</value> <value>应用</value>
</data> </data>
<data name="SettingsPageArtist.Header" xml:space="preserve">
<value>艺术家</value>
</data>
<data name="SettingsPageAutoAdjust.Header" xml:space="preserve"> <data name="SettingsPageAutoAdjust.Header" xml:space="preserve">
<value>自动调整</value> <value>自动调整</value>
</data> </data>
@@ -1189,12 +1195,15 @@
<data name="SettingsPagePlaybackShortcut.Text" xml:space="preserve"> <data name="SettingsPagePlaybackShortcut.Text" xml:space="preserve">
<value>播放</value> <value>播放</value>
</data> </data>
<data name="SettingsPagePlaybackSource.Text" xml:space="preserve"> <data name="SettingsPagePlaybackSource.Header" xml:space="preserve">
<value>播放源</value> <value>播放源</value>
</data> </data>
<data name="SettingsPagePlaybackSourceID.Text" xml:space="preserve"> <data name="SettingsPagePlaybackSourceID.Header" xml:space="preserve">
<value>播放源 ID</value> <value>播放源 ID</value>
</data> </data>
<data name="SettingsPagePlaybackStatus.Header" xml:space="preserve">
<value>当前播放源</value>
</data>
<data name="SettingsPagePlayingMockMusicButton.Content" xml:space="preserve"> <data name="SettingsPagePlayingMockMusicButton.Content" xml:space="preserve">
<value>在 “soundcloud.com” 上播放 “Cut to the Feeling”</value> <value>在 “soundcloud.com” 上播放 “Cut to the Feeling”</value>
</data> </data>
@@ -1219,6 +1228,9 @@
<data name="SettingsPageRecordedWindowStatus.Text" xml:space="preserve"> <data name="SettingsPageRecordedWindowStatus.Text" xml:space="preserve">
<value>记录的窗口状态</value> <value>记录的窗口状态</value>
</data> </data>
<data name="SettingsPageReference.Header" xml:space="preserve">
<value>参考链接</value>
</data>
<data name="SettingsPageRemoveInfo.Message" xml:space="preserve"> <data name="SettingsPageRemoveInfo.Message" xml:space="preserve">
<value>路径中的原始文件和文件夹不会被删除</value> <value>路径中的原始文件和文件夹不会被删除</value>
</data> </data>
@@ -1258,6 +1270,9 @@
<data name="SettingsPageScrollTopDuration.Header" xml:space="preserve"> <data name="SettingsPageScrollTopDuration.Header" xml:space="preserve">
<value>首行持续时间</value> <value>首行持续时间</value>
</data> </data>
<data name="SettingsPageSearchResultStatus.Header" xml:space="preserve">
<value>当前歌词搜索结果</value>
</data>
<data name="SettingsPageServerTestButton.Content" xml:space="preserve"> <data name="SettingsPageServerTestButton.Content" xml:space="preserve">
<value>测试服务器</value> <value>测试服务器</value>
</data> </data>
@@ -1321,6 +1336,12 @@
<data name="SettingsPageSongInfoRight.Content" xml:space="preserve"> <data name="SettingsPageSongInfoRight.Content" xml:space="preserve">
<value>靠右</value> <value>靠右</value>
</data> </data>
<data name="SettingsPageSongStatus.Header" xml:space="preserve">
<value>当前歌曲</value>
</data>
<data name="SettingsPageSongTitle.Header" xml:space="preserve">
<value>标题</value>
</data>
<data name="SettingsPageSpectrumLayer.Header" xml:space="preserve"> <data name="SettingsPageSpectrumLayer.Header" xml:space="preserve">
<value>[实验性] 频谱层</value> <value>[实验性] 频谱层</value>
</data> </data>

View File

@@ -144,6 +144,9 @@
<data name="Cancel" xml:space="preserve"> <data name="Cancel" xml:space="preserve">
<value>取消</value> <value>取消</value>
</data> </data>
<data name="Copy.Text" xml:space="preserve">
<value>複製</value>
</data>
<data name="CreatePlaylistSuccessfully" xml:space="preserve"> <data name="CreatePlaylistSuccessfully" xml:space="preserve">
<value>已成功建立播放清單</value> <value>已成功建立播放清單</value>
</data> </data>
@@ -228,7 +231,7 @@
<data name="LyricsNotFound" xml:space="preserve"> <data name="LyricsNotFound" xml:space="preserve">
<value>找不到歌詞</value> <value>找不到歌詞</value>
</data> </data>
<data name="LyricsPageLyricsProviderPrefix.Text" xml:space="preserve"> <data name="LyricsPageLyricsProviderPrefix.Header" xml:space="preserve">
<value>歌詞來源</value> <value>歌詞來源</value>
</data> </data>
<data name="LyricsPageLyricsSearchButtonToolTip.Content" xml:space="preserve"> <data name="LyricsPageLyricsSearchButtonToolTip.Content" xml:space="preserve">
@@ -237,7 +240,7 @@
<data name="LyricsPageLyricsSettingsButtonToolTip.Content" xml:space="preserve"> <data name="LyricsPageLyricsSettingsButtonToolTip.Content" xml:space="preserve">
<value>歌詞視窗管理快捷設定</value> <value>歌詞視窗管理快捷設定</value>
</data> </data>
<data name="LyricsPageMatchPercentage.Text" xml:space="preserve"> <data name="LyricsPageMatchPercentage.Header" xml:space="preserve">
<value>匹配百分比</value> <value>匹配百分比</value>
</data> </data>
<data name="LyricsPagePlaybackSourceButtonToolTip.Content" xml:space="preserve"> <data name="LyricsPagePlaybackSourceButtonToolTip.Content" xml:space="preserve">
@@ -264,7 +267,7 @@
<data name="LyricsPageTranslationOnly.Header" xml:space="preserve"> <data name="LyricsPageTranslationOnly.Header" xml:space="preserve">
<value>僅顯示翻譯</value> <value>僅顯示翻譯</value>
</data> </data>
<data name="LyricsPageTranslationProviderPrefix.Text" xml:space="preserve"> <data name="LyricsPageTranslationProviderPrefix.Header" xml:space="preserve">
<value>翻譯來源</value> <value>翻譯來源</value>
</data> </data>
<data name="LyricsSearchControlAlbum.Text" xml:space="preserve"> <data name="LyricsSearchControlAlbum.Text" xml:space="preserve">
@@ -273,7 +276,7 @@
<data name="LyricsSearchControlArtist.Text" xml:space="preserve"> <data name="LyricsSearchControlArtist.Text" xml:space="preserve">
<value>藝術家</value> <value>藝術家</value>
</data> </data>
<data name="LyricsSearchControlDurauion.Text" xml:space="preserve"> <data name="LyricsSearchControlDurauion.Header" xml:space="preserve">
<value>時長</value> <value>時長</value>
</data> </data>
<data name="LyricsSearchControlHelp.Text" xml:space="preserve"> <data name="LyricsSearchControlHelp.Text" xml:space="preserve">
@@ -306,9 +309,6 @@
<data name="LyricsSearchControlTargetSearchProvider.Header" xml:space="preserve"> <data name="LyricsSearchControlTargetSearchProvider.Header" xml:space="preserve">
<value>目標歌詞搜尋提供者</value> <value>目標歌詞搜尋提供者</value>
</data> </data>
<data name="LyricsSearchControlTitle.Text" xml:space="preserve">
<value>標題</value>
</data>
<data name="LyricsSearchPageTitle" xml:space="preserve"> <data name="LyricsSearchPageTitle" xml:space="preserve">
<value>歌詞搜尋 - BetterLyrics</value> <value>歌詞搜尋 - BetterLyrics</value>
</data> </data>
@@ -565,6 +565,9 @@
<data name="SettingsPageAdvanced.Text" xml:space="preserve"> <data name="SettingsPageAdvanced.Text" xml:space="preserve">
<value>高級選項</value> <value>高級選項</value>
</data> </data>
<data name="SettingsPageAlbum.Header" xml:space="preserve">
<value>專輯</value>
</data>
<data name="SettingsPageAlbumArt.Text" xml:space="preserve"> <data name="SettingsPageAlbumArt.Text" xml:space="preserve">
<value>專輯</value> <value>專輯</value>
</data> </data>
@@ -610,6 +613,9 @@
<data name="SettingsPageApply.Content" xml:space="preserve"> <data name="SettingsPageApply.Content" xml:space="preserve">
<value>應用</value> <value>應用</value>
</data> </data>
<data name="SettingsPageArtist.Header" xml:space="preserve">
<value>藝術家</value>
</data>
<data name="SettingsPageAutoAdjust.Header" xml:space="preserve"> <data name="SettingsPageAutoAdjust.Header" xml:space="preserve">
<value>自動調整</value> <value>自動調整</value>
</data> </data>
@@ -1189,12 +1195,15 @@
<data name="SettingsPagePlaybackShortcut.Text" xml:space="preserve"> <data name="SettingsPagePlaybackShortcut.Text" xml:space="preserve">
<value>播放</value> <value>播放</value>
</data> </data>
<data name="SettingsPagePlaybackSource.Text" xml:space="preserve"> <data name="SettingsPagePlaybackSource.Header" xml:space="preserve">
<value>播放源</value> <value>播放源</value>
</data> </data>
<data name="SettingsPagePlaybackSourceID.Text" xml:space="preserve"> <data name="SettingsPagePlaybackSourceID.Header" xml:space="preserve">
<value>播放源 ID</value> <value>播放源 ID</value>
</data> </data>
<data name="SettingsPagePlaybackStatus.Header" xml:space="preserve">
<value>當前播放源</value>
</data>
<data name="SettingsPagePlayingMockMusicButton.Content" xml:space="preserve"> <data name="SettingsPagePlayingMockMusicButton.Content" xml:space="preserve">
<value>在 “soundcloud.com” 上播放 “Cut to the Feeling”</value> <value>在 “soundcloud.com” 上播放 “Cut to the Feeling”</value>
</data> </data>
@@ -1219,6 +1228,9 @@
<data name="SettingsPageRecordedWindowStatus.Text" xml:space="preserve"> <data name="SettingsPageRecordedWindowStatus.Text" xml:space="preserve">
<value>記錄的窗口狀態</value> <value>記錄的窗口狀態</value>
</data> </data>
<data name="SettingsPageReference.Header" xml:space="preserve">
<value>參考數據</value>
</data>
<data name="SettingsPageRemoveInfo.Message" xml:space="preserve"> <data name="SettingsPageRemoveInfo.Message" xml:space="preserve">
<value>路徑中的原始檔案和資料夾不會被刪除</value> <value>路徑中的原始檔案和資料夾不會被刪除</value>
</data> </data>
@@ -1258,6 +1270,9 @@
<data name="SettingsPageScrollTopDuration.Header" xml:space="preserve"> <data name="SettingsPageScrollTopDuration.Header" xml:space="preserve">
<value>首行持續時間</value> <value>首行持續時間</value>
</data> </data>
<data name="SettingsPageSearchResultStatus.Header" xml:space="preserve">
<value>目前歌詞搜尋結果</value>
</data>
<data name="SettingsPageServerTestButton.Content" xml:space="preserve"> <data name="SettingsPageServerTestButton.Content" xml:space="preserve">
<value>測試服務器</value> <value>測試服務器</value>
</data> </data>
@@ -1321,6 +1336,12 @@
<data name="SettingsPageSongInfoRight.Content" xml:space="preserve"> <data name="SettingsPageSongInfoRight.Content" xml:space="preserve">
<value>靠右</value> <value>靠右</value>
</data> </data>
<data name="SettingsPageSongStatus.Header" xml:space="preserve">
<value>當前歌曲</value>
</data>
<data name="SettingsPageSongTitle.Header" xml:space="preserve">
<value>標題</value>
</data>
<data name="SettingsPageSpectrumLayer.Header" xml:space="preserve"> <data name="SettingsPageSpectrumLayer.Header" xml:space="preserve">
<value>[實驗性] 頻譜層</value> <value>[實驗性] 頻譜層</value>
</data> </data>