Compare commits
38 Commits
v1.2.232.0
...
v1.2.237.0
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
c576635af2 | ||
|
|
c8590202ec | ||
|
|
2dc8b1283f | ||
|
|
c482edea0f | ||
|
|
315722252c | ||
|
|
32ba453264 | ||
|
|
d4902329bb | ||
|
|
83aee8948b | ||
|
|
1f9fab3228 | ||
|
|
7a3a659dfc | ||
|
|
a14afd3eb5 | ||
|
|
c2af7f3186 | ||
|
|
cd026dd2bf | ||
|
|
4bc1a9975d | ||
|
|
07eecf0930 | ||
|
|
35fba5abb0 | ||
|
|
03ef231a3f | ||
|
|
f41879f4e5 | ||
|
|
bda7510ed6 | ||
|
|
5ec8c7c61f | ||
|
|
7e6bd9dade | ||
|
|
56244cb793 | ||
|
|
cb5f70ab55 | ||
|
|
3cc018bb1f | ||
|
|
c517d2b008 | ||
|
|
e79f2a0223 | ||
|
|
39122b9147 | ||
|
|
accbdc1806 | ||
|
|
de014d1ad7 | ||
|
|
cc2ce5f8cf | ||
|
|
2a2d80436e | ||
|
|
ce3f79f35c | ||
|
|
12e6000cb3 | ||
|
|
c1dc684411 | ||
|
|
69ea2cb495 | ||
|
|
e2ee03c4be | ||
|
|
c6fe33d6ae | ||
|
|
7744e145fa |
@@ -12,7 +12,7 @@
|
||||
<Identity
|
||||
Name="37412.BetterLyrics"
|
||||
Publisher="CN=E1428B0E-DC1D-4EA4-ACB1-4556569D5BA9"
|
||||
Version="1.2.232.0" />
|
||||
Version="1.2.236.0" />
|
||||
|
||||
<mp:PhoneIdentity PhoneProductId="ca4a4830-fc19-40d9-b823-53e2bff3d816" PhonePublisherId="00000000-0000-0000-0000-000000000000"/>
|
||||
|
||||
|
||||
@@ -76,6 +76,7 @@
|
||||
<converter:LyricsLayoutOrientationNegationToOrientationConverter x:Key="LyricsLayoutOrientationNegationToOrientationConverter" />
|
||||
<converter:FileSourceTypeToIconConverter x:Key="FileSourceTypeToIconConverter" />
|
||||
<converter:PathToImageConverter x:Key="PathToImageConverter" />
|
||||
<converter:DoubleToDecimalConverter x:Key="DoubleToDecimalConverter" />
|
||||
|
||||
<converters:BoolToVisibilityConverter x:Key="BoolToVisibilityConverter" />
|
||||
<converters:BoolNegationConverter x:Key="BoolNegationConverter" />
|
||||
|
||||
@@ -86,8 +86,8 @@
|
||||
<PackageReference Include="H.NotifyIcon.WinUI" Version="2.4.1" />
|
||||
<PackageReference Include="Hqub.Last.fm" Version="2.5.1" />
|
||||
<PackageReference Include="Interop.UIAutomationClient" Version="10.19041.0" />
|
||||
<PackageReference Include="LiveChartsCore.SkiaSharpView.WinUI" Version="2.0.0-rc6.1" />
|
||||
<PackageReference Include="Lyricify.Lyrics.Helper-NativeAot" Version="0.1.4-alpha.5" />
|
||||
<PackageReference Include="Microsoft.Data.SqlClient" Version="6.1.3" />
|
||||
<PackageReference Include="Microsoft.EntityFrameworkCore" Version="10.0.1" />
|
||||
<PackageReference Include="Microsoft.EntityFrameworkCore.Abstractions" Version="10.0.1" />
|
||||
<PackageReference Include="Microsoft.EntityFrameworkCore.Relational" Version="10.0.1" />
|
||||
|
||||
@@ -124,7 +124,14 @@
|
||||
</ListView.ItemTemplate>
|
||||
</ListView>
|
||||
|
||||
<dev:SettingsCard Style="{StaticResource DefaultSettingsExpanderItemStyle}">
|
||||
<StackPanel
|
||||
Margin="0,6,0,0"
|
||||
HorizontalAlignment="Right"
|
||||
Orientation="Horizontal"
|
||||
Spacing="6">
|
||||
<Button Command="{x:Bind ViewModel.OpenMusicGalleryWindowCommand}">
|
||||
<TextBlock x:Uid="SystemTrayMusicGallery" />
|
||||
</Button>
|
||||
<DropDownButton x:Uid="SettingsPageAddFolderButton">
|
||||
<DropDownButton.Flyout>
|
||||
<MenuFlyout>
|
||||
@@ -169,7 +176,7 @@
|
||||
</MenuFlyout>
|
||||
</DropDownButton.Flyout>
|
||||
</DropDownButton>
|
||||
</dev:SettingsCard>
|
||||
</StackPanel>
|
||||
|
||||
</StackPanel>
|
||||
</Grid>
|
||||
|
||||
@@ -3,9 +3,12 @@
|
||||
x:Class="BetterLyrics.WinUI3.Controls.StatsDashboardControl"
|
||||
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
|
||||
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
|
||||
xmlns:controls="using:CommunityToolkit.WinUI.Controls"
|
||||
xmlns:converters="using:BetterLyrics.WinUI3.Converter"
|
||||
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
|
||||
xmlns:dev="using:DevWinUI"
|
||||
xmlns:local="using:BetterLyrics.WinUI3.Controls"
|
||||
xmlns:lvc="using:LiveChartsCore.SkiaSharpView.WinUI"
|
||||
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
|
||||
xmlns:models="using:BetterLyrics.WinUI3.Models"
|
||||
xmlns:statsmodels="using:BetterLyrics.WinUI3.Models.Stats"
|
||||
@@ -14,7 +17,7 @@
|
||||
|
||||
<UserControl.Resources>
|
||||
<Style x:Key="StatsCardStyle" TargetType="Border">
|
||||
<Setter Property="Background" Value="{ThemeResource LayerFillColorDefaultBrush}" />
|
||||
<Setter Property="Background" Value="{ThemeResource CardBackgroundFillColorDefaultBrush}" />
|
||||
<Setter Property="BorderBrush" Value="{ThemeResource CardStrokeColorDefaultBrush}" />
|
||||
<Setter Property="BorderThickness" Value="1" />
|
||||
<Setter Property="CornerRadius" Value="8" />
|
||||
@@ -23,38 +26,65 @@
|
||||
</Style>
|
||||
</UserControl.Resources>
|
||||
|
||||
<Grid Margin="0,24,0,0">
|
||||
<Grid Margin="0,20,0,0">
|
||||
<Grid.RowDefinitions>
|
||||
<RowDefinition Height="Auto" />
|
||||
<RowDefinition Height="*" />
|
||||
</Grid.RowDefinitions>
|
||||
|
||||
<Grid Grid.Row="0" Margin="20,0">
|
||||
<Pivot x:Name="TimeRangePivot" SelectionChanged="Pivot_SelectionChanged">
|
||||
<PivotItem x:Uid="StatsDashboardControlToday" Tag="Day" />
|
||||
<PivotItem x:Uid="StatsDashboardControlThisWeek" Tag="Week" />
|
||||
<PivotItem x:Uid="StatsDashboardControlThisMonth" Tag="Month" />
|
||||
<PivotItem x:Uid="StatsDashboardControlThisQuarter" Tag="Quarter" />
|
||||
<PivotItem x:Uid="StatsDashboardControlThisYear" Tag="Year" />
|
||||
</Pivot>
|
||||
<Grid Grid.Row="0" Margin="36,12">
|
||||
<Grid.ColumnDefinitions>
|
||||
<ColumnDefinition Width="Auto" />
|
||||
<ColumnDefinition Width="*" />
|
||||
<ColumnDefinition Width="Auto" />
|
||||
</Grid.ColumnDefinitions>
|
||||
|
||||
<StackPanel Orientation="Horizontal" Spacing="12">
|
||||
<ComboBox
|
||||
x:Uid="StatsDashboardControlTimeRange"
|
||||
Header="Time Range"
|
||||
SelectedIndex="{x:Bind ViewModel.SelectedTimeRange, Mode=TwoWay, Converter={StaticResource EnumToIntConverter}}">
|
||||
<ComboBoxItem x:Uid="StatsDashboardControlToday" />
|
||||
<ComboBoxItem x:Uid="StatsDashboardControlThisWeek" />
|
||||
<ComboBoxItem x:Uid="StatsDashboardControlThisMonth" />
|
||||
<ComboBoxItem x:Uid="StatsDashboardControlThisQuarter" />
|
||||
<ComboBoxItem x:Uid="StatsDashboardControlThisYear" />
|
||||
<ComboBoxItem x:Uid="StatsDashboardControlCustom" />
|
||||
</ComboBox>
|
||||
|
||||
<StackPanel
|
||||
Margin="0,0,0,5"
|
||||
VerticalAlignment="Bottom"
|
||||
Orientation="Horizontal"
|
||||
Spacing="8"
|
||||
Visibility="{x:Bind ViewModel.IsCustomRangeSelected, Mode=OneWay, Converter={StaticResource BoolToVisibilityConverter}}">
|
||||
<CalendarDatePicker x:Uid="StatsDashboardControlStart" Date="{x:Bind ViewModel.CustomStartDate, Mode=TwoWay}" />
|
||||
<TextBlock
|
||||
Margin="0,26,0,0"
|
||||
VerticalAlignment="Center"
|
||||
Text="-" />
|
||||
<CalendarDatePicker x:Uid="StatsDashboardControlEnd" Date="{x:Bind ViewModel.CustomEndDate, Mode=TwoWay}" />
|
||||
</StackPanel>
|
||||
</StackPanel>
|
||||
</Grid>
|
||||
|
||||
<ScrollViewer Grid.Row="1" Padding="20,0">
|
||||
<ScrollViewer Grid.Row="1" Padding="36,0">
|
||||
<Grid>
|
||||
<Grid.RowDefinitions>
|
||||
<RowDefinition Height="Auto" />
|
||||
<RowDefinition Height="Auto" />
|
||||
<RowDefinition Height="*" />
|
||||
<RowDefinition />
|
||||
<RowDefinition />
|
||||
<RowDefinition />
|
||||
<RowDefinition />
|
||||
<RowDefinition />
|
||||
</Grid.RowDefinitions>
|
||||
|
||||
<Grid Grid.Row="0" Margin="0,20,0,0">
|
||||
<Grid Grid.Row="0">
|
||||
<Grid.ColumnDefinitions>
|
||||
<ColumnDefinition Width="*" />
|
||||
<ColumnDefinition Width="*" />
|
||||
<ColumnDefinition Width="*" />
|
||||
</Grid.ColumnDefinitions>
|
||||
|
||||
<!-- 总播放时长 -->
|
||||
<Border Grid.Column="0" Style="{StaticResource StatsCardStyle}">
|
||||
<StackPanel>
|
||||
<StackPanel
|
||||
@@ -71,7 +101,7 @@
|
||||
<TextBlock
|
||||
Foreground="{ThemeResource AccentTextFillColorPrimaryBrush}"
|
||||
Style="{ThemeResource SubtitleTextBlockStyle}"
|
||||
Text="{x:Bind ViewModel.TotalDuration.TotalHours, Mode=OneWay}" />
|
||||
Text="{x:Bind ViewModel.TotalDuration.TotalHours, Mode=OneWay, Converter={StaticResource DoubleToDecimalConverter}}" />
|
||||
<TextBlock
|
||||
Margin="0,0,0,2"
|
||||
VerticalAlignment="Bottom"
|
||||
@@ -83,7 +113,6 @@
|
||||
</StackPanel>
|
||||
</Border>
|
||||
|
||||
<!-- 总播放歌曲次数 -->
|
||||
<Border Grid.Column="1" Style="{StaticResource StatsCardStyle}">
|
||||
<StackPanel>
|
||||
<StackPanel
|
||||
@@ -100,7 +129,6 @@
|
||||
</StackPanel>
|
||||
</Border>
|
||||
|
||||
<!-- Top source -->
|
||||
<Border
|
||||
Grid.Column="2"
|
||||
Margin="0,0,0,12"
|
||||
@@ -121,9 +149,87 @@
|
||||
</Border>
|
||||
</Grid>
|
||||
|
||||
<Grid Grid.Row="1">
|
||||
<!-- Activity by hour -->
|
||||
<Border
|
||||
Grid.Row="1"
|
||||
Margin="0,0,0,12"
|
||||
Style="{StaticResource StatsCardStyle}">
|
||||
<Grid>
|
||||
<Grid.RowDefinitions>
|
||||
<RowDefinition Height="Auto" />
|
||||
<RowDefinition Height="Auto" />
|
||||
<RowDefinition Height="Auto" />
|
||||
</Grid.RowDefinitions>
|
||||
|
||||
<StackPanel
|
||||
Margin="0,0,0,12"
|
||||
Orientation="Horizontal"
|
||||
Spacing="8">
|
||||
<TextBlock x:Uid="StatsDashboardControlActivityByHour" Style="{ThemeResource SubtitleTextBlockStyle}" />
|
||||
</StackPanel>
|
||||
|
||||
<Grid Grid.Row="1" Margin="0,0,0,16">
|
||||
<Grid.ColumnDefinitions>
|
||||
<ColumnDefinition Width="1.5*" />
|
||||
<ColumnDefinition Width="*" />
|
||||
<ColumnDefinition Width="*" />
|
||||
</Grid.ColumnDefinitions>
|
||||
<StackPanel>
|
||||
<TextBlock
|
||||
x:Uid="StatsDashboardControlMostActive"
|
||||
FontSize="12"
|
||||
Foreground="{ThemeResource SystemControlForegroundBaseMediumBrush}" />
|
||||
<TextBlock FontWeight="SemiBold" Text="{x:Bind ViewModel.PeakHourText, Mode=OneWay}" />
|
||||
</StackPanel>
|
||||
<StackPanel Grid.Column="1">
|
||||
<TextBlock
|
||||
x:Uid="StatsDashboardControlLeastActive"
|
||||
FontSize="12"
|
||||
Foreground="{ThemeResource SystemControlForegroundBaseMediumBrush}" />
|
||||
<TextBlock FontWeight="SemiBold" Text="{x:Bind ViewModel.QuietHourText, Mode=OneWay}" />
|
||||
</StackPanel>
|
||||
</Grid>
|
||||
|
||||
<lvc:CartesianChart
|
||||
Grid.Row="2"
|
||||
Height="180"
|
||||
Margin="0,8,0,0"
|
||||
Background="Transparent"
|
||||
TooltipPosition="Top">
|
||||
|
||||
<lvc:CartesianChart.XAxes>
|
||||
<lvc:AxesCollection>
|
||||
<lvc:XamlAxis Labels="{x:Bind ViewModel.HourlyXAxisLabels, Mode=OneWay}" TextSize="{StaticResource BodyTextBlockFontSize}" />
|
||||
</lvc:AxesCollection>
|
||||
</lvc:CartesianChart.XAxes>
|
||||
|
||||
<lvc:CartesianChart.YAxes>
|
||||
<lvc:AxesCollection>
|
||||
<lvc:XamlAxis
|
||||
x:Uid="StatsDashboardControlTrackCountAxis"
|
||||
NameTextSize="{StaticResource BodyTextBlockFontSize}"
|
||||
ShowSeparatorLines="False"
|
||||
TextSize="{StaticResource BodyTextBlockFontSize}" />
|
||||
</lvc:AxesCollection>
|
||||
</lvc:CartesianChart.YAxes>
|
||||
|
||||
<lvc:CartesianChart.Series>
|
||||
<lvc:SeriesCollection>
|
||||
<lvc:XamlColumnSeries
|
||||
x:Name="HourlySeries"
|
||||
Rx="4"
|
||||
Ry="4"
|
||||
Values="{x:Bind ViewModel.HourlySeriesValues, Mode=OneWay}" />
|
||||
</lvc:SeriesCollection>
|
||||
</lvc:CartesianChart.Series>
|
||||
|
||||
</lvc:CartesianChart>
|
||||
</Grid>
|
||||
</Border>
|
||||
|
||||
<!-- Top artists and sources -->
|
||||
<Grid Grid.Row="2">
|
||||
<Grid.ColumnDefinitions>
|
||||
<ColumnDefinition Width="*" />
|
||||
<ColumnDefinition Width="*" />
|
||||
</Grid.ColumnDefinitions>
|
||||
|
||||
@@ -131,51 +237,50 @@
|
||||
<Border Grid.Column="0" Style="{StaticResource StatsCardStyle}">
|
||||
<Grid>
|
||||
<Grid.RowDefinitions>
|
||||
<RowDefinition Height="Auto" />
|
||||
<RowDefinition Height="*" />
|
||||
<RowDefinition />
|
||||
<RowDefinition MinHeight="250" />
|
||||
</Grid.RowDefinitions>
|
||||
<TextBlock
|
||||
x:Uid="StatsDashboardControlTopArtists"
|
||||
Margin="0,0,0,12"
|
||||
Style="{ThemeResource SubtitleTextBlockStyle}" />
|
||||
|
||||
<ItemsControl Grid.Row="1" ItemsSource="{x:Bind ViewModel.TopArtists, Mode=OneWay}">
|
||||
<ItemsControl.ItemTemplate>
|
||||
<DataTemplate x:DataType="statsmodels:ArtistPlayCount">
|
||||
<Grid Margin="0,4">
|
||||
<Grid.ColumnDefinitions>
|
||||
<ColumnDefinition Width="*" />
|
||||
<ColumnDefinition Width="Auto" />
|
||||
</Grid.ColumnDefinitions>
|
||||
<StackPanel Orientation="Horizontal" Spacing="10">
|
||||
<PersonPicture
|
||||
Width="32"
|
||||
Height="32"
|
||||
DisplayName="{x:Bind Artist}" />
|
||||
<TextBlock
|
||||
VerticalAlignment="Center"
|
||||
Style="{ThemeResource BodyStrongTextBlockStyle}"
|
||||
Text="{x:Bind Artist}" />
|
||||
</StackPanel>
|
||||
<TextBlock
|
||||
Grid.Column="1"
|
||||
VerticalAlignment="Center"
|
||||
FontWeight="SemiBold">
|
||||
<Run Text="{x:Bind PlayCount}" />
|
||||
<Run
|
||||
FontSize="10"
|
||||
FontWeight="Normal"
|
||||
Foreground="{ThemeResource SystemControlForegroundBaseMediumBrush}"
|
||||
Text="plays" />
|
||||
</TextBlock>
|
||||
</Grid>
|
||||
</DataTemplate>
|
||||
</ItemsControl.ItemTemplate>
|
||||
</ItemsControl>
|
||||
<lvc:CartesianChart
|
||||
Grid.Row="1"
|
||||
Margin="0,8,0,0"
|
||||
Background="Transparent">
|
||||
|
||||
<lvc:CartesianChart.XAxes>
|
||||
<lvc:AxesCollection>
|
||||
<lvc:XamlAxis x:Uid="StatsDashboardControlTrackCountAxis" NameTextSize="{StaticResource BodyTextBlockFontSize}" />
|
||||
</lvc:AxesCollection>
|
||||
</lvc:CartesianChart.XAxes>
|
||||
|
||||
<lvc:CartesianChart.YAxes>
|
||||
<lvc:AxesCollection>
|
||||
<lvc:XamlAxis IsInverted="True" IsVisible="False" />
|
||||
</lvc:AxesCollection>
|
||||
</lvc:CartesianChart.YAxes>
|
||||
|
||||
<lvc:CartesianChart.Series>
|
||||
<lvc:SeriesCollection>
|
||||
<lvc:XamlRowSeries
|
||||
Padding="4"
|
||||
DataLabelsFormatter="{x:Bind ViewModel.ArtistsLabelsFormatter}"
|
||||
DataLabelsSize="{StaticResource BodyTextBlockFontSize}"
|
||||
Rx="4"
|
||||
Ry="4"
|
||||
ShowDataLabels="True"
|
||||
Values="{x:Bind ViewModel.ArtistSeriesValues, Mode=OneWay}" />
|
||||
</lvc:SeriesCollection>
|
||||
</lvc:CartesianChart.Series>
|
||||
|
||||
</lvc:CartesianChart>
|
||||
|
||||
</Grid>
|
||||
</Border>
|
||||
|
||||
<!-- Top sources -->
|
||||
<!-- 播放源分布 -->
|
||||
<Border
|
||||
Grid.Column="1"
|
||||
Margin="0,0,0,12"
|
||||
@@ -190,100 +295,85 @@
|
||||
Margin="0,0,0,12"
|
||||
Style="{ThemeResource SubtitleTextBlockStyle}" />
|
||||
|
||||
<ItemsControl Grid.Row="1" ItemsSource="{x:Bind ViewModel.PlayerStats, Mode=OneWay}">
|
||||
<ItemsControl.ItemTemplate>
|
||||
<DataTemplate x:DataType="models:PlayerStatDisplayItem">
|
||||
<Grid Margin="0,4">
|
||||
<Grid.ColumnDefinitions>
|
||||
<ColumnDefinition Width="*" />
|
||||
<ColumnDefinition Width="Auto" />
|
||||
</Grid.ColumnDefinitions>
|
||||
<TextBlock
|
||||
FontSize="13"
|
||||
Style="{ThemeResource BodyTextBlockStyle}"
|
||||
Text="{x:Bind PlayerName}" />
|
||||
<TextBlock
|
||||
Grid.Column="1"
|
||||
VerticalAlignment="Center"
|
||||
FontWeight="SemiBold">
|
||||
<Run Text="{x:Bind PlayCount}" />
|
||||
<Run
|
||||
FontSize="10"
|
||||
FontWeight="Normal"
|
||||
Foreground="{ThemeResource SystemControlForegroundBaseMediumBrush}"
|
||||
Text="plays" />
|
||||
</TextBlock>
|
||||
</Grid>
|
||||
</DataTemplate>
|
||||
</ItemsControl.ItemTemplate>
|
||||
</ItemsControl>
|
||||
<lvc:PieChart
|
||||
Grid.Row="1"
|
||||
MinHeight="160"
|
||||
Background="Transparent"
|
||||
LegendPosition="Right"
|
||||
LegendTextSize="{StaticResource BodyTextBlockFontSize}"
|
||||
Series="{x:Bind ViewModel.SourceSeries, Mode=OneWay}"
|
||||
TooltipPosition="Center" />
|
||||
|
||||
</Grid>
|
||||
</Border>
|
||||
</Grid>
|
||||
|
||||
<!-- Top song -->
|
||||
<!-- Top tracks -->
|
||||
<Border
|
||||
Grid.Row="2"
|
||||
Grid.Row="3"
|
||||
Margin="0,0,0,20"
|
||||
Style="{StaticResource StatsCardStyle}">
|
||||
<Grid>
|
||||
<Grid.RowDefinitions>
|
||||
<RowDefinition Height="Auto" />
|
||||
<RowDefinition Height="*" />
|
||||
<RowDefinition />
|
||||
<RowDefinition />
|
||||
</Grid.RowDefinitions>
|
||||
<TextBlock
|
||||
x:Uid="StatsDashboardControlTopSongs"
|
||||
Margin="0,0,0,12"
|
||||
Margin="0,0,0,18"
|
||||
Style="{ThemeResource SubtitleTextBlockStyle}" />
|
||||
|
||||
<dev:OpacityMaskView Grid.Row="1" Margin="-20,0">
|
||||
<dev:OpacityMaskView.OpacityMask>
|
||||
<LinearGradientBrush StartPoint="0,0" EndPoint="1,0">
|
||||
<GradientStop Offset="0" Color="Transparent" />
|
||||
<GradientStop Offset="0.02" Color="#FFFFFFFF" />
|
||||
<GradientStop Offset="0.98" Color="#FFFFFFFF" />
|
||||
<GradientStop Offset="1" Color="Transparent" />
|
||||
</LinearGradientBrush>
|
||||
</dev:OpacityMaskView.OpacityMask>
|
||||
<ListView
|
||||
Grid.Row="1"
|
||||
Padding="20,0"
|
||||
ItemContainerStyle="{StaticResource ListViewStretchedItemContainerStyle}"
|
||||
ItemsSource="{x:Bind ViewModel.TopSongs, Mode=OneWay}"
|
||||
ScrollViewer.HorizontalScrollBarVisibility="Hidden"
|
||||
ScrollViewer.HorizontalScrollMode="Enabled"
|
||||
ScrollViewer.VerticalScrollBarVisibility="Disabled"
|
||||
ScrollViewer.VerticalScrollMode="Disabled"
|
||||
SelectionMode="None">
|
||||
<ListView.ItemsPanel>
|
||||
<ItemsPanelTemplate>
|
||||
<ItemsStackPanel Orientation="Horizontal" />
|
||||
</ItemsPanelTemplate>
|
||||
</ListView.ItemsPanel>
|
||||
<ListView.ItemTemplate>
|
||||
<DataTemplate x:DataType="statsmodels:SongPlayCount">
|
||||
<Grid Margin="0,4">
|
||||
<Grid.ColumnDefinitions>
|
||||
<ColumnDefinition Width="Auto" />
|
||||
<ColumnDefinition Width="*" />
|
||||
<ColumnDefinition Width="Auto" />
|
||||
</Grid.ColumnDefinitions>
|
||||
<Grid
|
||||
Width="40"
|
||||
Height="40"
|
||||
Margin="0,0,12,0"
|
||||
Background="{ThemeResource LayerFillColorAltBrush}"
|
||||
MinWidth="200"
|
||||
Margin="6,0"
|
||||
Background="{ThemeResource CardBackgroundFillColorSecondaryBrush}"
|
||||
BorderBrush="{ThemeResource CardStrokeColorDefaultBrush}"
|
||||
BorderThickness="1"
|
||||
CornerRadius="4">
|
||||
<FontIcon
|
||||
FontSize="16"
|
||||
Foreground="{ThemeResource SystemControlForegroundBaseMediumBrush}"
|
||||
Glyph="" />
|
||||
</Grid>
|
||||
|
||||
<StackPanel Grid.Column="1" VerticalAlignment="Center">
|
||||
<TextBlock Style="{ThemeResource BodyStrongTextBlockStyle}" Text="{x:Bind Title}" />
|
||||
<StackPanel Margin="20">
|
||||
<TextBlock
|
||||
Foreground="{ThemeResource SystemControlForegroundBaseMediumBrush}"
|
||||
Style="{ThemeResource CaptionTextBlockStyle}"
|
||||
Text="{x:Bind Artist}" />
|
||||
</StackPanel>
|
||||
|
||||
<TextBlock
|
||||
Grid.Column="2"
|
||||
VerticalAlignment="Center"
|
||||
FontWeight="SemiBold">
|
||||
Foreground="{ThemeResource AccentTextFillColorPrimaryBrush}"
|
||||
Style="{StaticResource SubtitleTextBlockStyle}"
|
||||
Text="{x:Bind Title}"
|
||||
TextWrapping="Wrap" />
|
||||
<RichTextBlock>
|
||||
<Paragraph>
|
||||
<Run Text="{x:Bind Artist}" />
|
||||
<Run Text="·" />
|
||||
<Run Text="{x:Bind PlayCount}" />
|
||||
<Run
|
||||
FontSize="10"
|
||||
FontWeight="Normal"
|
||||
Foreground="{ThemeResource SystemControlForegroundBaseMediumBrush}"
|
||||
Text="plays" />
|
||||
</TextBlock>
|
||||
<Run x:Uid="StatsDashboardControlTrackCountText" />
|
||||
</Paragraph>
|
||||
</RichTextBlock>
|
||||
</StackPanel>
|
||||
</Grid>
|
||||
</DataTemplate>
|
||||
</ListView.ItemTemplate>
|
||||
</ListView>
|
||||
</dev:OpacityMaskView>
|
||||
</Grid>
|
||||
</Border>
|
||||
|
||||
@@ -297,6 +387,5 @@
|
||||
Command="{x:Bind ViewModel.GenerateTestDataCommand}"
|
||||
Content="Generate test data"
|
||||
Visibility="Collapsed" />
|
||||
|
||||
</Grid>
|
||||
</UserControl>
|
||||
@@ -29,30 +29,6 @@ public sealed partial class StatsDashboardControl : UserControl
|
||||
{
|
||||
InitializeComponent();
|
||||
DataContext = Ioc.Default.GetRequiredService<StatsDashboardControlViewModel>();
|
||||
this.Loaded += StatsDashboardControl_Loaded;
|
||||
}
|
||||
|
||||
private async void StatsDashboardControl_Loaded(object sender, Microsoft.UI.Xaml.RoutedEventArgs e)
|
||||
{
|
||||
await ViewModel.LoadDataAsync(StatsRange.Day);
|
||||
}
|
||||
|
||||
private async void Pivot_SelectionChanged(object sender, SelectionChangedEventArgs e)
|
||||
{
|
||||
if (ViewModel == null) return;
|
||||
|
||||
if (TimeRangePivot.SelectedItem is PivotItem item && item.Tag is string tag)
|
||||
{
|
||||
var range = tag switch
|
||||
{
|
||||
"Day" => StatsRange.Day,
|
||||
"Week" => StatsRange.Week,
|
||||
"Month" => StatsRange.Month,
|
||||
"Quarter" => StatsRange.Quarter,
|
||||
"Year" => StatsRange.Year,
|
||||
_ => StatsRange.Day
|
||||
};
|
||||
await ViewModel.LoadDataAsync(range);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,33 @@
|
||||
using Microsoft.UI.Xaml.Data;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Text;
|
||||
|
||||
namespace BetterLyrics.WinUI3.Converter
|
||||
{
|
||||
public partial class DoubleToDecimalConverter : IValueConverter
|
||||
{
|
||||
public object Convert(object value, Type targetType, object parameter, string language)
|
||||
{
|
||||
if (value == null) return string.Empty;
|
||||
|
||||
if (double.TryParse(value.ToString(), out double number))
|
||||
{
|
||||
int decimalPlaces = 2;
|
||||
if (parameter != null && int.TryParse(parameter.ToString(), out int parsedParams))
|
||||
{
|
||||
decimalPlaces = parsedParams;
|
||||
}
|
||||
|
||||
return number.ToString($"F{decimalPlaces}");
|
||||
}
|
||||
|
||||
return value.ToString() ?? "";
|
||||
}
|
||||
|
||||
public object ConvertBack(object value, Type targetType, object parameter, string language)
|
||||
{
|
||||
throw new NotImplementedException();
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -6,10 +6,11 @@ namespace BetterLyrics.WinUI3.Enums
|
||||
{
|
||||
public enum StatsRange
|
||||
{
|
||||
Day,
|
||||
Week,
|
||||
Month,
|
||||
Quarter,
|
||||
Year
|
||||
Today,
|
||||
ThisWeek,
|
||||
ThisMonth,
|
||||
ThisQuarter,
|
||||
ThisYear,
|
||||
Custom
|
||||
}
|
||||
}
|
||||
|
||||
@@ -4,6 +4,7 @@ using BetterLyrics.WinUI3.Enums;
|
||||
using BetterLyrics.WinUI3.Hooks;
|
||||
using Microsoft.UI;
|
||||
using Microsoft.UI.Xaml;
|
||||
using SkiaSharp;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Drawing.Imaging;
|
||||
@@ -15,6 +16,16 @@ namespace BetterLyrics.WinUI3.Helper
|
||||
{
|
||||
public static class ColorHelper
|
||||
{
|
||||
public static Color GetSystemAccentColor()
|
||||
{
|
||||
if (Application.Current.Resources.TryGetValue("SystemAccentColor", out var resource) &&
|
||||
resource is Color uiColor)
|
||||
{
|
||||
return uiColor;
|
||||
}
|
||||
return Color.FromArgb(255, 0, 120, 215);
|
||||
}
|
||||
|
||||
public static ElementTheme GetElementThemeFromBackgroundColor(Color backgroundColor)
|
||||
{
|
||||
// 计算亮度(YIQ公式)
|
||||
|
||||
@@ -1,4 +1,5 @@
|
||||
using ColorThiefDotNet;
|
||||
using CommunityToolkit.WinUI.Helpers;
|
||||
using Impressionist.Abstractions;
|
||||
using Impressionist.Implementations;
|
||||
using System;
|
||||
@@ -50,7 +51,29 @@ namespace BetterLyrics.WinUI3.Helper
|
||||
return paletteResult;
|
||||
}
|
||||
|
||||
public static async Task<Dictionary<Vector3, int>> GetPixelColor(BitmapDecoder bitmapDecoder)
|
||||
public static List<Windows.UI.Color> GenerateChartColors(Windows.UI.Color baseColor, int count)
|
||||
{
|
||||
List<Windows.UI.Color> results = [];
|
||||
|
||||
var baseHsl = baseColor.ToHsl();
|
||||
double baseHue = baseHsl.H;
|
||||
double baseSaturation = baseHsl.S;
|
||||
double baseBrightness = baseHsl.L;
|
||||
|
||||
double step = 360.0 / count;
|
||||
|
||||
for (int i = 0; i < count; i++)
|
||||
{
|
||||
double newHue = (baseHue + (step * i)) % 360;
|
||||
|
||||
Windows.UI.Color newColor = CommunityToolkit.WinUI.Helpers.ColorHelper.FromHsl(newHue, baseSaturation, baseBrightness);
|
||||
results.Add(newColor);
|
||||
}
|
||||
|
||||
return results;
|
||||
}
|
||||
|
||||
private static async Task<Dictionary<Vector3, int>> GetPixelColor(BitmapDecoder bitmapDecoder)
|
||||
{
|
||||
var pixelDataProvider = await bitmapDecoder.GetPixelDataAsync();
|
||||
var pixels = pixelDataProvider.DetachPixelData();
|
||||
|
||||
@@ -0,0 +1,14 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Text;
|
||||
|
||||
namespace BetterLyrics.WinUI3.Models.Stats
|
||||
{
|
||||
public class HourlyStatBar
|
||||
{
|
||||
public int Hour { get; set; }
|
||||
public double NormalizedHeight { get; set; } // 0 - 100,用于UI高度
|
||||
public int RawCount { get; set; } // 实际播放数
|
||||
public string Label { get; set; } // Tooltip: "09:00 - 15 plays"
|
||||
}
|
||||
}
|
||||
@@ -203,6 +203,7 @@ namespace BetterLyrics.WinUI3.Services.MediaSessionsService
|
||||
if (!_mediaManager.IsStarted) return;
|
||||
if (mediaSession == null)
|
||||
{
|
||||
_scrobbleStopwatch.Reset();
|
||||
CurrentPosition = TimeSpan.Zero;
|
||||
return;
|
||||
}
|
||||
@@ -213,6 +214,7 @@ namespace BetterLyrics.WinUI3.Services.MediaSessionsService
|
||||
|
||||
if (!IsMediaSourceEnabled(mediaSession.Id))
|
||||
{
|
||||
_scrobbleStopwatch.Reset();
|
||||
CurrentPosition = TimeSpan.Zero;
|
||||
}
|
||||
else
|
||||
@@ -239,7 +241,6 @@ namespace BetterLyrics.WinUI3.Services.MediaSessionsService
|
||||
|
||||
var desiredSession = GetCurrentSession();
|
||||
|
||||
//RecordMediaSourceProviderInfo(mediaSession);
|
||||
if (mediaSession != desiredSession) return;
|
||||
|
||||
if (!IsMediaSourceEnabled(mediaSession.Id))
|
||||
@@ -254,6 +255,15 @@ namespace BetterLyrics.WinUI3.Services.MediaSessionsService
|
||||
_ => false,
|
||||
};
|
||||
}
|
||||
|
||||
if (CurrentIsPlaying)
|
||||
{
|
||||
_scrobbleStopwatch.Start();
|
||||
}
|
||||
else
|
||||
{
|
||||
_scrobbleStopwatch.Stop();
|
||||
}
|
||||
}));
|
||||
}
|
||||
|
||||
@@ -469,6 +479,7 @@ namespace BetterLyrics.WinUI3.Services.MediaSessionsService
|
||||
|
||||
CurrentMediaSourceProviderInfo = GetCurrentMediaSourceProviderInfo();
|
||||
|
||||
_scrobbleStopwatch.Reset();
|
||||
CurrentPosition = TimeSpan.Zero;
|
||||
|
||||
_discordService.Disable();
|
||||
|
||||
@@ -1,4 +1,5 @@
|
||||
using BetterLyrics.WinUI3.Models;
|
||||
using BetterLyrics.WinUI3.Constants;
|
||||
using BetterLyrics.WinUI3.Models;
|
||||
using BetterLyrics.WinUI3.Models.Db;
|
||||
using BetterLyrics.WinUI3.Models.Stats;
|
||||
using Microsoft.EntityFrameworkCore;
|
||||
@@ -99,7 +100,7 @@ namespace BetterLyrics.WinUI3.Services.PlayHistoryService
|
||||
|
||||
var totalMs = await context.PlayHistory
|
||||
.Where(x => x.StartedAt >= start && x.StartedAt <= end)
|
||||
.SumAsync(x => x.DurationPlayedMs); // 直接在数据库层面求和
|
||||
.SumAsync(x => Math.Min(x.DurationPlayedMs, x.TotalDurationMs)); // 防止超过歌曲本身时长
|
||||
|
||||
return TimeSpan.FromMilliseconds(totalMs);
|
||||
}
|
||||
@@ -197,7 +198,14 @@ namespace BetterLyrics.WinUI3.Services.PlayHistoryService
|
||||
("Summer", "Calvin Harris", "Motion"),
|
||||
};
|
||||
|
||||
var playerIds = new[] { "Spotify", "Spotify", "Spotify", "MusicBee", "MusicBee", "QQMusic", "NeteaseCloudMusic", "AppleMusic" };
|
||||
var playerIds = new[]
|
||||
{
|
||||
PlayerId.Spotify, PlayerId.Spotify, PlayerId.Spotify,
|
||||
PlayerId.MusicBee, PlayerId.MusicBee,
|
||||
PlayerId.QQMusic,
|
||||
PlayerId.NetEaseCloudMusic,
|
||||
PlayerId.AppleMusic,
|
||||
};
|
||||
|
||||
var batchList = new List<PlayHistoryItem>();
|
||||
|
||||
|
||||
@@ -1467,22 +1467,46 @@
|
||||
<data name="StandardMode" xml:space="preserve">
|
||||
<value>الوضع القياسي</value>
|
||||
</data>
|
||||
<data name="StatsDashboardControlActivityByHour.Text" xml:space="preserve">
|
||||
<value>النشاط بالساعة</value>
|
||||
</data>
|
||||
<data name="StatsDashboardControlCustom.Content" xml:space="preserve">
|
||||
<value>مخصص</value>
|
||||
</data>
|
||||
<data name="StatsDashboardControlEnd.Header" xml:space="preserve">
|
||||
<value>النهاية</value>
|
||||
</data>
|
||||
<data name="StatsDashboardControlLeastActive.Text" xml:space="preserve">
|
||||
<value>الأقل نشاطاً</value>
|
||||
</data>
|
||||
<data name="StatsDashboardControlMostActive.Text" xml:space="preserve">
|
||||
<value>الأكثر نشاطاً</value>
|
||||
</data>
|
||||
<data name="StatsDashboardControlSources.Text" xml:space="preserve">
|
||||
<value>المصادر</value>
|
||||
</data>
|
||||
<data name="StatsDashboardControlThisMonth.Header" xml:space="preserve">
|
||||
<data name="StatsDashboardControlStart.Header" xml:space="preserve">
|
||||
<value>ابدأ</value>
|
||||
</data>
|
||||
<data name="StatsDashboardControlThisMonth.Content" xml:space="preserve">
|
||||
<value>هذا الشهر</value>
|
||||
</data>
|
||||
<data name="StatsDashboardControlThisQuarter.Header" xml:space="preserve">
|
||||
<data name="StatsDashboardControlThisQuarter.Content" xml:space="preserve">
|
||||
<value>هذا الربع</value>
|
||||
</data>
|
||||
<data name="StatsDashboardControlThisWeek.Header" xml:space="preserve">
|
||||
<data name="StatsDashboardControlThisWeek.Content" xml:space="preserve">
|
||||
<value>هذا الأسبوع</value>
|
||||
</data>
|
||||
<data name="StatsDashboardControlThisYear.Header" xml:space="preserve">
|
||||
<data name="StatsDashboardControlThisYear.Content" xml:space="preserve">
|
||||
<value>هذا العام</value>
|
||||
</data>
|
||||
<data name="StatsDashboardControlToday.Header" xml:space="preserve">
|
||||
<data name="StatsDashboardControlTimeRange.Header" xml:space="preserve">
|
||||
<value>النطاق الزمني</value>
|
||||
</data>
|
||||
<data name="StatsDashboardControlTimes" xml:space="preserve">
|
||||
<value>التايمز</value>
|
||||
</data>
|
||||
<data name="StatsDashboardControlToday.Content" xml:space="preserve">
|
||||
<value>اليوم</value>
|
||||
</data>
|
||||
<data name="StatsDashboardControlTopArtists.Text" xml:space="preserve">
|
||||
@@ -1497,6 +1521,12 @@
|
||||
<data name="StatsDashboardControlTotalDuration.Text" xml:space="preserve">
|
||||
<value>المدة الإجمالية</value>
|
||||
</data>
|
||||
<data name="StatsDashboardControlTrackCountAxis.AxisName" xml:space="preserve">
|
||||
<value>التايمز</value>
|
||||
</data>
|
||||
<data name="StatsDashboardControlTrackCountText.Text" xml:space="preserve">
|
||||
<value>التايمز</value>
|
||||
</data>
|
||||
<data name="StatsDashboardControlTracksPlayed.Text" xml:space="preserve">
|
||||
<value>المسارات التي تم تشغيلها</value>
|
||||
</data>
|
||||
|
||||
@@ -1467,22 +1467,46 @@
|
||||
<data name="StandardMode" xml:space="preserve">
|
||||
<value>Standard-Modus</value>
|
||||
</data>
|
||||
<data name="StatsDashboardControlActivityByHour.Text" xml:space="preserve">
|
||||
<value>Aktivität nach Stunden</value>
|
||||
</data>
|
||||
<data name="StatsDashboardControlCustom.Content" xml:space="preserve">
|
||||
<value>Benutzerdefiniert</value>
|
||||
</data>
|
||||
<data name="StatsDashboardControlEnd.Header" xml:space="preserve">
|
||||
<value>Ende</value>
|
||||
</data>
|
||||
<data name="StatsDashboardControlLeastActive.Text" xml:space="preserve">
|
||||
<value>Am wenigsten aktiv</value>
|
||||
</data>
|
||||
<data name="StatsDashboardControlMostActive.Text" xml:space="preserve">
|
||||
<value>Aktivste</value>
|
||||
</data>
|
||||
<data name="StatsDashboardControlSources.Text" xml:space="preserve">
|
||||
<value>Quellen</value>
|
||||
</data>
|
||||
<data name="StatsDashboardControlThisMonth.Header" xml:space="preserve">
|
||||
<data name="StatsDashboardControlStart.Header" xml:space="preserve">
|
||||
<value>Start</value>
|
||||
</data>
|
||||
<data name="StatsDashboardControlThisMonth.Content" xml:space="preserve">
|
||||
<value>Dieser Monat</value>
|
||||
</data>
|
||||
<data name="StatsDashboardControlThisQuarter.Header" xml:space="preserve">
|
||||
<data name="StatsDashboardControlThisQuarter.Content" xml:space="preserve">
|
||||
<value>Dieses Quartal</value>
|
||||
</data>
|
||||
<data name="StatsDashboardControlThisWeek.Header" xml:space="preserve">
|
||||
<data name="StatsDashboardControlThisWeek.Content" xml:space="preserve">
|
||||
<value>Diese Woche</value>
|
||||
</data>
|
||||
<data name="StatsDashboardControlThisYear.Header" xml:space="preserve">
|
||||
<data name="StatsDashboardControlThisYear.Content" xml:space="preserve">
|
||||
<value>Dieses Jahr</value>
|
||||
</data>
|
||||
<data name="StatsDashboardControlToday.Header" xml:space="preserve">
|
||||
<data name="StatsDashboardControlTimeRange.Header" xml:space="preserve">
|
||||
<value>Zeitspanne</value>
|
||||
</data>
|
||||
<data name="StatsDashboardControlTimes" xml:space="preserve">
|
||||
<value>Zeiten</value>
|
||||
</data>
|
||||
<data name="StatsDashboardControlToday.Content" xml:space="preserve">
|
||||
<value>Heute</value>
|
||||
</data>
|
||||
<data name="StatsDashboardControlTopArtists.Text" xml:space="preserve">
|
||||
@@ -1497,6 +1521,12 @@
|
||||
<data name="StatsDashboardControlTotalDuration.Text" xml:space="preserve">
|
||||
<value>Gesamtdauer</value>
|
||||
</data>
|
||||
<data name="StatsDashboardControlTrackCountAxis.AxisName" xml:space="preserve">
|
||||
<value>Zeiten</value>
|
||||
</data>
|
||||
<data name="StatsDashboardControlTrackCountText.Text" xml:space="preserve">
|
||||
<value>Zeiten</value>
|
||||
</data>
|
||||
<data name="StatsDashboardControlTracksPlayed.Text" xml:space="preserve">
|
||||
<value>Gespielte Tracks</value>
|
||||
</data>
|
||||
|
||||
@@ -1467,22 +1467,46 @@
|
||||
<data name="StandardMode" xml:space="preserve">
|
||||
<value>Standard Mode</value>
|
||||
</data>
|
||||
<data name="StatsDashboardControlActivityByHour.Text" xml:space="preserve">
|
||||
<value>Activity by Hour</value>
|
||||
</data>
|
||||
<data name="StatsDashboardControlCustom.Content" xml:space="preserve">
|
||||
<value>Custom</value>
|
||||
</data>
|
||||
<data name="StatsDashboardControlEnd.Header" xml:space="preserve">
|
||||
<value>End</value>
|
||||
</data>
|
||||
<data name="StatsDashboardControlLeastActive.Text" xml:space="preserve">
|
||||
<value>Least Active</value>
|
||||
</data>
|
||||
<data name="StatsDashboardControlMostActive.Text" xml:space="preserve">
|
||||
<value>Most Active</value>
|
||||
</data>
|
||||
<data name="StatsDashboardControlSources.Text" xml:space="preserve">
|
||||
<value>Sources</value>
|
||||
</data>
|
||||
<data name="StatsDashboardControlThisMonth.Header" xml:space="preserve">
|
||||
<data name="StatsDashboardControlStart.Header" xml:space="preserve">
|
||||
<value>Start</value>
|
||||
</data>
|
||||
<data name="StatsDashboardControlThisMonth.Content" xml:space="preserve">
|
||||
<value>This Month</value>
|
||||
</data>
|
||||
<data name="StatsDashboardControlThisQuarter.Header" xml:space="preserve">
|
||||
<data name="StatsDashboardControlThisQuarter.Content" xml:space="preserve">
|
||||
<value>This Quarter</value>
|
||||
</data>
|
||||
<data name="StatsDashboardControlThisWeek.Header" xml:space="preserve">
|
||||
<data name="StatsDashboardControlThisWeek.Content" xml:space="preserve">
|
||||
<value>This Week</value>
|
||||
</data>
|
||||
<data name="StatsDashboardControlThisYear.Header" xml:space="preserve">
|
||||
<data name="StatsDashboardControlThisYear.Content" xml:space="preserve">
|
||||
<value>This Year</value>
|
||||
</data>
|
||||
<data name="StatsDashboardControlToday.Header" xml:space="preserve">
|
||||
<data name="StatsDashboardControlTimeRange.Header" xml:space="preserve">
|
||||
<value>Time Range</value>
|
||||
</data>
|
||||
<data name="StatsDashboardControlTimes" xml:space="preserve">
|
||||
<value>Times</value>
|
||||
</data>
|
||||
<data name="StatsDashboardControlToday.Content" xml:space="preserve">
|
||||
<value>Today</value>
|
||||
</data>
|
||||
<data name="StatsDashboardControlTopArtists.Text" xml:space="preserve">
|
||||
@@ -1497,6 +1521,12 @@
|
||||
<data name="StatsDashboardControlTotalDuration.Text" xml:space="preserve">
|
||||
<value>Total Duration</value>
|
||||
</data>
|
||||
<data name="StatsDashboardControlTrackCountAxis.AxisName" xml:space="preserve">
|
||||
<value>Times</value>
|
||||
</data>
|
||||
<data name="StatsDashboardControlTrackCountText.Text" xml:space="preserve">
|
||||
<value>Times</value>
|
||||
</data>
|
||||
<data name="StatsDashboardControlTracksPlayed.Text" xml:space="preserve">
|
||||
<value>Tracks Played</value>
|
||||
</data>
|
||||
|
||||
@@ -1467,22 +1467,46 @@
|
||||
<data name="StandardMode" xml:space="preserve">
|
||||
<value>Modo Estándar</value>
|
||||
</data>
|
||||
<data name="StatsDashboardControlActivityByHour.Text" xml:space="preserve">
|
||||
<value>Actividad por horas</value>
|
||||
</data>
|
||||
<data name="StatsDashboardControlCustom.Content" xml:space="preserve">
|
||||
<value>A medida</value>
|
||||
</data>
|
||||
<data name="StatsDashboardControlEnd.Header" xml:space="preserve">
|
||||
<value>Fin</value>
|
||||
</data>
|
||||
<data name="StatsDashboardControlLeastActive.Text" xml:space="preserve">
|
||||
<value>Menos activo</value>
|
||||
</data>
|
||||
<data name="StatsDashboardControlMostActive.Text" xml:space="preserve">
|
||||
<value>Más activos</value>
|
||||
</data>
|
||||
<data name="StatsDashboardControlSources.Text" xml:space="preserve">
|
||||
<value>Fuentes</value>
|
||||
</data>
|
||||
<data name="StatsDashboardControlThisMonth.Header" xml:space="preserve">
|
||||
<data name="StatsDashboardControlStart.Header" xml:space="preserve">
|
||||
<value>Inicio</value>
|
||||
</data>
|
||||
<data name="StatsDashboardControlThisMonth.Content" xml:space="preserve">
|
||||
<value>Este mes</value>
|
||||
</data>
|
||||
<data name="StatsDashboardControlThisQuarter.Header" xml:space="preserve">
|
||||
<data name="StatsDashboardControlThisQuarter.Content" xml:space="preserve">
|
||||
<value>Este trimestre</value>
|
||||
</data>
|
||||
<data name="StatsDashboardControlThisWeek.Header" xml:space="preserve">
|
||||
<data name="StatsDashboardControlThisWeek.Content" xml:space="preserve">
|
||||
<value>Esta semana</value>
|
||||
</data>
|
||||
<data name="StatsDashboardControlThisYear.Header" xml:space="preserve">
|
||||
<data name="StatsDashboardControlThisYear.Content" xml:space="preserve">
|
||||
<value>Este año</value>
|
||||
</data>
|
||||
<data name="StatsDashboardControlToday.Header" xml:space="preserve">
|
||||
<data name="StatsDashboardControlTimeRange.Header" xml:space="preserve">
|
||||
<value>Intervalo de tiempo</value>
|
||||
</data>
|
||||
<data name="StatsDashboardControlTimes" xml:space="preserve">
|
||||
<value>Times</value>
|
||||
</data>
|
||||
<data name="StatsDashboardControlToday.Content" xml:space="preserve">
|
||||
<value>Hoy</value>
|
||||
</data>
|
||||
<data name="StatsDashboardControlTopArtists.Text" xml:space="preserve">
|
||||
@@ -1497,6 +1521,12 @@
|
||||
<data name="StatsDashboardControlTotalDuration.Text" xml:space="preserve">
|
||||
<value>Duración total</value>
|
||||
</data>
|
||||
<data name="StatsDashboardControlTrackCountAxis.AxisName" xml:space="preserve">
|
||||
<value>Times</value>
|
||||
</data>
|
||||
<data name="StatsDashboardControlTrackCountText.Text" xml:space="preserve">
|
||||
<value>Times</value>
|
||||
</data>
|
||||
<data name="StatsDashboardControlTracksPlayed.Text" xml:space="preserve">
|
||||
<value>Pistas reproducidas</value>
|
||||
</data>
|
||||
|
||||
@@ -1467,22 +1467,46 @@
|
||||
<data name="StandardMode" xml:space="preserve">
|
||||
<value>Mode Standard</value>
|
||||
</data>
|
||||
<data name="StatsDashboardControlActivityByHour.Text" xml:space="preserve">
|
||||
<value>Activité par heure</value>
|
||||
</data>
|
||||
<data name="StatsDashboardControlCustom.Content" xml:space="preserve">
|
||||
<value>Sur mesure</value>
|
||||
</data>
|
||||
<data name="StatsDashboardControlEnd.Header" xml:space="preserve">
|
||||
<value>Fin</value>
|
||||
</data>
|
||||
<data name="StatsDashboardControlLeastActive.Text" xml:space="preserve">
|
||||
<value>Le moins actif</value>
|
||||
</data>
|
||||
<data name="StatsDashboardControlMostActive.Text" xml:space="preserve">
|
||||
<value>Les plus actifs</value>
|
||||
</data>
|
||||
<data name="StatsDashboardControlSources.Text" xml:space="preserve">
|
||||
<value>Sources d'information</value>
|
||||
</data>
|
||||
<data name="StatsDashboardControlThisMonth.Header" xml:space="preserve">
|
||||
<data name="StatsDashboardControlStart.Header" xml:space="preserve">
|
||||
<value>Démarrage</value>
|
||||
</data>
|
||||
<data name="StatsDashboardControlThisMonth.Content" xml:space="preserve">
|
||||
<value>Ce mois-ci</value>
|
||||
</data>
|
||||
<data name="StatsDashboardControlThisQuarter.Header" xml:space="preserve">
|
||||
<data name="StatsDashboardControlThisQuarter.Content" xml:space="preserve">
|
||||
<value>Ce trimestre</value>
|
||||
</data>
|
||||
<data name="StatsDashboardControlThisWeek.Header" xml:space="preserve">
|
||||
<data name="StatsDashboardControlThisWeek.Content" xml:space="preserve">
|
||||
<value>Cette semaine</value>
|
||||
</data>
|
||||
<data name="StatsDashboardControlThisYear.Header" xml:space="preserve">
|
||||
<data name="StatsDashboardControlThisYear.Content" xml:space="preserve">
|
||||
<value>Cette année</value>
|
||||
</data>
|
||||
<data name="StatsDashboardControlToday.Header" xml:space="preserve">
|
||||
<data name="StatsDashboardControlTimeRange.Header" xml:space="preserve">
|
||||
<value>Plage de temps</value>
|
||||
</data>
|
||||
<data name="StatsDashboardControlTimes" xml:space="preserve">
|
||||
<value>Temps</value>
|
||||
</data>
|
||||
<data name="StatsDashboardControlToday.Content" xml:space="preserve">
|
||||
<value>Aujourd'hui</value>
|
||||
</data>
|
||||
<data name="StatsDashboardControlTopArtists.Text" xml:space="preserve">
|
||||
@@ -1497,6 +1521,12 @@
|
||||
<data name="StatsDashboardControlTotalDuration.Text" xml:space="preserve">
|
||||
<value>Durée totale</value>
|
||||
</data>
|
||||
<data name="StatsDashboardControlTrackCountAxis.AxisName" xml:space="preserve">
|
||||
<value>Temps</value>
|
||||
</data>
|
||||
<data name="StatsDashboardControlTrackCountText.Text" xml:space="preserve">
|
||||
<value>Temps</value>
|
||||
</data>
|
||||
<data name="StatsDashboardControlTracksPlayed.Text" xml:space="preserve">
|
||||
<value>Pistes jouées</value>
|
||||
</data>
|
||||
|
||||
@@ -1467,22 +1467,46 @@
|
||||
<data name="StandardMode" xml:space="preserve">
|
||||
<value>मानक मोड</value>
|
||||
</data>
|
||||
<data name="StatsDashboardControlActivityByHour.Text" xml:space="preserve">
|
||||
<value>घंटे के हिसाब से गतिविधि</value>
|
||||
</data>
|
||||
<data name="StatsDashboardControlCustom.Content" xml:space="preserve">
|
||||
<value>कस्टम</value>
|
||||
</data>
|
||||
<data name="StatsDashboardControlEnd.Header" xml:space="preserve">
|
||||
<value>समाप्त</value>
|
||||
</data>
|
||||
<data name="StatsDashboardControlLeastActive.Text" xml:space="preserve">
|
||||
<value>सबसे कम सक्रिय</value>
|
||||
</data>
|
||||
<data name="StatsDashboardControlMostActive.Text" xml:space="preserve">
|
||||
<value>सर्वाधिक सक्रिय</value>
|
||||
</data>
|
||||
<data name="StatsDashboardControlSources.Text" xml:space="preserve">
|
||||
<value>स्रोत</value>
|
||||
</data>
|
||||
<data name="StatsDashboardControlThisMonth.Header" xml:space="preserve">
|
||||
<data name="StatsDashboardControlStart.Header" xml:space="preserve">
|
||||
<value>शुरू करें</value>
|
||||
</data>
|
||||
<data name="StatsDashboardControlThisMonth.Content" xml:space="preserve">
|
||||
<value>इस महीने</value>
|
||||
</data>
|
||||
<data name="StatsDashboardControlThisQuarter.Header" xml:space="preserve">
|
||||
<data name="StatsDashboardControlThisQuarter.Content" xml:space="preserve">
|
||||
<value>इस तिमाही</value>
|
||||
</data>
|
||||
<data name="StatsDashboardControlThisWeek.Header" xml:space="preserve">
|
||||
<data name="StatsDashboardControlThisWeek.Content" xml:space="preserve">
|
||||
<value>इस सप्ताह</value>
|
||||
</data>
|
||||
<data name="StatsDashboardControlThisYear.Header" xml:space="preserve">
|
||||
<data name="StatsDashboardControlThisYear.Content" xml:space="preserve">
|
||||
<value>इस वर्ष</value>
|
||||
</data>
|
||||
<data name="StatsDashboardControlToday.Header" xml:space="preserve">
|
||||
<data name="StatsDashboardControlTimeRange.Header" xml:space="preserve">
|
||||
<value>समय सीमा</value>
|
||||
</data>
|
||||
<data name="StatsDashboardControlTimes" xml:space="preserve">
|
||||
<value>दूसरे दर्जे का</value>
|
||||
</data>
|
||||
<data name="StatsDashboardControlToday.Content" xml:space="preserve">
|
||||
<value>आज</value>
|
||||
</data>
|
||||
<data name="StatsDashboardControlTopArtists.Text" xml:space="preserve">
|
||||
@@ -1497,6 +1521,12 @@
|
||||
<data name="StatsDashboardControlTotalDuration.Text" xml:space="preserve">
|
||||
<value>कुल अवधि</value>
|
||||
</data>
|
||||
<data name="StatsDashboardControlTrackCountAxis.AxisName" xml:space="preserve">
|
||||
<value>दूसरे दर्जे का</value>
|
||||
</data>
|
||||
<data name="StatsDashboardControlTrackCountText.Text" xml:space="preserve">
|
||||
<value>दूसरे दर्जे का</value>
|
||||
</data>
|
||||
<data name="StatsDashboardControlTracksPlayed.Text" xml:space="preserve">
|
||||
<value>बजाए गए ट्रैक</value>
|
||||
</data>
|
||||
|
||||
@@ -1467,22 +1467,46 @@
|
||||
<data name="StandardMode" xml:space="preserve">
|
||||
<value>Mode Standar</value>
|
||||
</data>
|
||||
<data name="StatsDashboardControlActivityByHour.Text" xml:space="preserve">
|
||||
<value>Aktivitas per Jam</value>
|
||||
</data>
|
||||
<data name="StatsDashboardControlCustom.Content" xml:space="preserve">
|
||||
<value>Kustom</value>
|
||||
</data>
|
||||
<data name="StatsDashboardControlEnd.Header" xml:space="preserve">
|
||||
<value>Akhir</value>
|
||||
</data>
|
||||
<data name="StatsDashboardControlLeastActive.Text" xml:space="preserve">
|
||||
<value>Paling Tidak Aktif</value>
|
||||
</data>
|
||||
<data name="StatsDashboardControlMostActive.Text" xml:space="preserve">
|
||||
<value>Paling Aktif</value>
|
||||
</data>
|
||||
<data name="StatsDashboardControlSources.Text" xml:space="preserve">
|
||||
<value>Sumber</value>
|
||||
</data>
|
||||
<data name="StatsDashboardControlThisMonth.Header" xml:space="preserve">
|
||||
<data name="StatsDashboardControlStart.Header" xml:space="preserve">
|
||||
<value>Mulai</value>
|
||||
</data>
|
||||
<data name="StatsDashboardControlThisMonth.Content" xml:space="preserve">
|
||||
<value>Bulan ini</value>
|
||||
</data>
|
||||
<data name="StatsDashboardControlThisQuarter.Header" xml:space="preserve">
|
||||
<data name="StatsDashboardControlThisQuarter.Content" xml:space="preserve">
|
||||
<value>Kuartal ini</value>
|
||||
</data>
|
||||
<data name="StatsDashboardControlThisWeek.Header" xml:space="preserve">
|
||||
<data name="StatsDashboardControlThisWeek.Content" xml:space="preserve">
|
||||
<value>Minggu Ini</value>
|
||||
</data>
|
||||
<data name="StatsDashboardControlThisYear.Header" xml:space="preserve">
|
||||
<data name="StatsDashboardControlThisYear.Content" xml:space="preserve">
|
||||
<value>Tahun ini</value>
|
||||
</data>
|
||||
<data name="StatsDashboardControlToday.Header" xml:space="preserve">
|
||||
<data name="StatsDashboardControlTimeRange.Header" xml:space="preserve">
|
||||
<value>Rentang Waktu</value>
|
||||
</data>
|
||||
<data name="StatsDashboardControlTimes" xml:space="preserve">
|
||||
<value>Waktu</value>
|
||||
</data>
|
||||
<data name="StatsDashboardControlToday.Content" xml:space="preserve">
|
||||
<value>Hari ini</value>
|
||||
</data>
|
||||
<data name="StatsDashboardControlTopArtists.Text" xml:space="preserve">
|
||||
@@ -1497,6 +1521,12 @@
|
||||
<data name="StatsDashboardControlTotalDuration.Text" xml:space="preserve">
|
||||
<value>Total Durasi</value>
|
||||
</data>
|
||||
<data name="StatsDashboardControlTrackCountAxis.AxisName" xml:space="preserve">
|
||||
<value>Waktu</value>
|
||||
</data>
|
||||
<data name="StatsDashboardControlTrackCountText.Text" xml:space="preserve">
|
||||
<value>Waktu</value>
|
||||
</data>
|
||||
<data name="StatsDashboardControlTracksPlayed.Text" xml:space="preserve">
|
||||
<value>Lagu yang Dimainkan</value>
|
||||
</data>
|
||||
|
||||
@@ -169,7 +169,7 @@
|
||||
<value>LX Music サーバーに接続できません。「設定」-「再生ソース」-「LX Music」-「LX Music サーバー」に移動し、リンクが正しく入力されているか確認してください</value>
|
||||
</data>
|
||||
<data name="FileSystemServiceCleaningCache" xml:space="preserve">
|
||||
<value>キャッシュをクリーニング中...</value>
|
||||
<value>キャッシュクリア中...</value>
|
||||
</data>
|
||||
<data name="FileSystemServiceConnectFailed" xml:space="preserve">
|
||||
<value>接続に失敗しました</value>
|
||||
@@ -181,19 +181,19 @@
|
||||
<value>ファイルリストを取得しています...</value>
|
||||
</data>
|
||||
<data name="FileSystemServiceParsing" xml:space="preserve">
|
||||
<value>Parsing...</value>
|
||||
<value>解析中...</value>
|
||||
</data>
|
||||
<data name="FileSystemServicePrepareToClean" xml:space="preserve">
|
||||
<value>キャッシュ・クリーン準備中</value>
|
||||
<value>キャッシュクリア準備中...</value>
|
||||
</data>
|
||||
<data name="FileSystemServiceReady" xml:space="preserve">
|
||||
<value>準備完了</value>
|
||||
</data>
|
||||
<data name="FileSystemServiceRootDirectoryWarning" xml:space="preserve">
|
||||
<value>ルートディレクトリのパスが検出された。フルディスクインデックスにはメディア以外のファイルが多数含まれている可能性があり、スキャンに時間がかかりすぎる。特定のサブディレクトリを指定することを推奨する。</value>
|
||||
<value>ルートディレクトリが指定されました。フルディスクのインデックス作成には大量の非メディアファイルが含まれる可能性があり、スキャンに時間がかかる恐れがあります。特定のサブディレクトリを指定することをお勧めします。</value>
|
||||
</data>
|
||||
<data name="FileSystemServiceWaitingForScan" xml:space="preserve">
|
||||
<value>スキャンを待っています...</value>
|
||||
<value>スキャン準備中...</value>
|
||||
</data>
|
||||
<data name="FullscreenMode" xml:space="preserve">
|
||||
<value>全画面モード</value>
|
||||
@@ -259,13 +259,13 @@
|
||||
<value>歌詞の言語</value>
|
||||
</data>
|
||||
<data name="LyricsPageLyricsProviderPrefix.Header" xml:space="preserve">
|
||||
<value>歌詞提供者</value>
|
||||
<value>歌詞提供元</value>
|
||||
</data>
|
||||
<data name="LyricsPageLyricsSearch.Text" xml:space="preserve">
|
||||
<value>歌詞検索</value>
|
||||
</data>
|
||||
<data name="LyricsPageLyricsSettings.Text" xml:space="preserve">
|
||||
<value>歌詞ウィンドウのショートカット</value>
|
||||
<value>歌詞ウィンドウのショートカット設定</value>
|
||||
</data>
|
||||
<data name="LyricsPageMatchPercentage.Header" xml:space="preserve">
|
||||
<value>一致率</value>
|
||||
@@ -289,7 +289,7 @@
|
||||
<value>翻訳提供元</value>
|
||||
</data>
|
||||
<data name="LyricsPageTransliterationProviderPrefix.Header" xml:space="preserve">
|
||||
<value>翻訳提供元</value>
|
||||
<value>ルビ提供元</value>
|
||||
</data>
|
||||
<data name="LyricsParseError" xml:space="preserve">
|
||||
<value>歌詞の解析に失敗しました</value>
|
||||
@@ -307,7 +307,7 @@
|
||||
<value>曲の長さ</value>
|
||||
</data>
|
||||
<data name="LyricsSearchControlHelp.Text" xml:space="preserve">
|
||||
<value>* 変更は保存後すぐに反映され、マッピング情報とターゲットの歌詞を使用して後続の曲の歌詞が取得されます。 「Instrumental」としてマークすると、「Instrumental」プレースホルダの歌詞に直接戻ります。 リセットすると元のデータの検索が復元されます。</value>
|
||||
<value>* 変更は保存後すぐに反映され、以降はマッピング情報に基づいた歌詞取得が行われます。「インストゥルメンタル」としてマークすると、専用のプレースホルダー歌詞に切り替わります。リセットを実行すると、元のデータ取得状態に戻ります。</value>
|
||||
</data>
|
||||
<data name="LyricsSearchControlIgnoreCache.Header" xml:space="preserve">
|
||||
<value>検索時にキャッシュを無視する</value>
|
||||
@@ -316,7 +316,7 @@
|
||||
<value>マッピング先</value>
|
||||
</data>
|
||||
<data name="LyricsSearchControlMarkAsPureMusic.Content" xml:space="preserve">
|
||||
<value>インストとしてマーク</value>
|
||||
<value>インストゥルメンタルとしてマーク</value>
|
||||
</data>
|
||||
<data name="LyricsSearchControlNotFound.Text" xml:space="preserve">
|
||||
<value>見つかりません</value>
|
||||
@@ -367,10 +367,10 @@
|
||||
<value>さらにモードを追加するには「設定」に移動します</value>
|
||||
</data>
|
||||
<data name="LyricsWindowSwitchWindowTitle" xml:space="preserve">
|
||||
<value>歌詞ウィンドウ切替</value>
|
||||
<value>歌詞ウィンドウスイッチャー</value>
|
||||
</data>
|
||||
<data name="MainPageAlbumArtOnly.Content" xml:space="preserve">
|
||||
<value>アルバムアートエリアのみ表示</value>
|
||||
<value>アルバムアートのみ表示</value>
|
||||
</data>
|
||||
<data name="MainPageLyriscOnly.Content" xml:space="preserve">
|
||||
<value>歌詞のみ表示</value>
|
||||
@@ -412,13 +412,13 @@
|
||||
<value>再生キューに追加</value>
|
||||
</data>
|
||||
<data name="MusicGalleryPageAllSongs" xml:space="preserve">
|
||||
<value>すべてのミュージック</value>
|
||||
<value>すべての曲</value>
|
||||
</data>
|
||||
<data name="MusicGalleryPageDataSync.Message" xml:space="preserve">
|
||||
<value>メディアライブラリー同期中...</value>
|
||||
<value>メディアライブラリーの同期中...</value>
|
||||
</data>
|
||||
<data name="MusicGalleryPageDataSyncError.Message" xml:space="preserve">
|
||||
<value>メディアライブラリの同期に問題があります</value>
|
||||
<value>メディアライブラリーの同期に問題が発生しました</value>
|
||||
</data>
|
||||
<data name="MusicGalleryPageEmptyPlayingQueue.Text" xml:space="preserve">
|
||||
<value>キューをクリア</value>
|
||||
@@ -460,7 +460,7 @@
|
||||
<value>年</value>
|
||||
</data>
|
||||
<data name="MusicGalleryPageFileNotFound.Text" xml:space="preserve">
|
||||
<value>メディアライブラリに曲が見つかりません</value>
|
||||
<value>メディアライブラリーに曲が見つかりません</value>
|
||||
</data>
|
||||
<data name="MusicGalleryPageFolder.Text" xml:space="preserve">
|
||||
<value>フォルダ</value>
|
||||
@@ -523,22 +523,22 @@
|
||||
<value>ミュージックギャラリー - BetterLyrics</value>
|
||||
</data>
|
||||
<data name="MusicSettingsControlAutoSyncInterval.Header" xml:space="preserve">
|
||||
<value>自動同期周波数</value>
|
||||
<value>自動同期の頻度</value>
|
||||
</data>
|
||||
<data name="MusicSettingsControlAutoSyncIntervalDisabled.Content" xml:space="preserve">
|
||||
<value>一切なし</value>
|
||||
<value>なし</value>
|
||||
</data>
|
||||
<data name="MusicSettingsControlAutoSyncIntervalEveryDay.Content" xml:space="preserve">
|
||||
<value>毎日</value>
|
||||
</data>
|
||||
<data name="MusicSettingsControlAutoSyncIntervalEveryFifteenMin.Content" xml:space="preserve">
|
||||
<value>15分ごと</value>
|
||||
<value>15分間隔</value>
|
||||
</data>
|
||||
<data name="MusicSettingsControlAutoSyncIntervalEveryHour.Content" xml:space="preserve">
|
||||
<value>1時間ごと</value>
|
||||
<value>1時間間隔</value>
|
||||
</data>
|
||||
<data name="MusicSettingsControlAutoSyncIntervalEverySixHrs.Content" xml:space="preserve">
|
||||
<value>6時間ごと</value>
|
||||
<value>6時間間隔</value>
|
||||
</data>
|
||||
<data name="NarrowMode" xml:space="preserve">
|
||||
<value>狭い表示モード</value>
|
||||
@@ -556,13 +556,13 @@
|
||||
<value>個人情報保護方針</value>
|
||||
</data>
|
||||
<data name="RemoteServerConfigControlBrowse.Content" xml:space="preserve">
|
||||
<value>ブラウズ</value>
|
||||
<value>参照</value>
|
||||
</data>
|
||||
<data name="RemoteServerConfigControlName.Header" xml:space="preserve">
|
||||
<value>名称</value>
|
||||
</data>
|
||||
<data name="RemoteServerConfigControlName.PlaceholderText" xml:space="preserve">
|
||||
<value>空白のままにしておくと、自動的にデフォルトの名前が生成される。</value>
|
||||
<value>空欄のままにすると、デフォルトの名前が自動生成されます。</value>
|
||||
</data>
|
||||
<data name="RemoteServerConfigControlPassword.Header" xml:space="preserve">
|
||||
<value>パスワード</value>
|
||||
@@ -571,7 +571,7 @@
|
||||
<value>パス</value>
|
||||
</data>
|
||||
<data name="RemoteServerConfigControlPathNotExisted" xml:space="preserve">
|
||||
<value>指定されたフォルダのパスが見つかりません</value>
|
||||
<value>指定されたパスが見つかりません</value>
|
||||
</data>
|
||||
<data name="RemoteServerConfigControlPathRequired" xml:space="preserve">
|
||||
<value>パスが必要</value>
|
||||
@@ -613,7 +613,7 @@
|
||||
<value>デザイン参考</value>
|
||||
</data>
|
||||
<data name="SettingsPage3DLyrics.Header" xml:space="preserve">
|
||||
<value>[実験的] 深度エフェクト</value>
|
||||
<value>[実験的] 奥行きのエフェクト</value>
|
||||
</data>
|
||||
<data name="SettingsPage3DLyricsDepth.Header" xml:space="preserve">
|
||||
<value>深度</value>
|
||||
@@ -640,7 +640,7 @@
|
||||
<value>アルバムアートの高さ</value>
|
||||
</data>
|
||||
<data name="SettingsPageAlbumArtLayer.Header" xml:space="preserve">
|
||||
<value>アルバムアートのレイヤー</value>
|
||||
<value>アルバムアートレイヤー</value>
|
||||
</data>
|
||||
<data name="SettingsPageAlbumArtSearchProvidersConfig.Text" xml:space="preserve">
|
||||
<value>アルバムアートのソースを編集する</value>
|
||||
@@ -688,10 +688,10 @@
|
||||
<value>起動時にデフォルトの歌詞ウィンドウを自動的に開く</value>
|
||||
</data>
|
||||
<data name="SettingsPageAutoOpenMusicGalleryWindow.Header" xml:space="preserve">
|
||||
<value>起動時にギャラリーウィンドウを開く</value>
|
||||
<value>起動時にミュージックギャラリーウィンドウを開く</value>
|
||||
</data>
|
||||
<data name="SettingsPageAutoPlayWhenOpenMusicGalleryWindow.Header" xml:space="preserve">
|
||||
<value>ギャラリーウィンドウを開いたときに自動的に再生を再開</value>
|
||||
<value>ミュージックギャラリーを開いたときに自動的に再生を再開する</value>
|
||||
</data>
|
||||
<data name="SettingsPageAutoStart.Header" xml:space="preserve">
|
||||
<value>自動起動</value>
|
||||
@@ -703,7 +703,7 @@
|
||||
<value>ぼかし量</value>
|
||||
</data>
|
||||
<data name="SettingsPageCache.Description" xml:space="preserve">
|
||||
<value>ログファイル、オンライン歌詞キャッシュを含む</value>
|
||||
<value>ログファイル、オンライン歌詞キャッシュを含みます</value>
|
||||
</data>
|
||||
<data name="SettingsPageCache.Header" xml:space="preserve">
|
||||
<value>キャッシュ</value>
|
||||
@@ -712,13 +712,13 @@
|
||||
<value>中央揃え</value>
|
||||
</data>
|
||||
<data name="SettingsPageCheckShortcut.Content" xml:space="preserve">
|
||||
<value>キー割り当ての確認</value>
|
||||
<value>ショートカットキー確認</value>
|
||||
</data>
|
||||
<data name="SettingsPageChinese.Header" xml:space="preserve">
|
||||
<value>ピンインルビ</value>
|
||||
</data>
|
||||
<data name="SettingsPageChineseLyrics.Text" xml:space="preserve">
|
||||
<value>中国語の歌詞</value>
|
||||
<value>中国語歌詞</value>
|
||||
</data>
|
||||
<data name="SettingsPageChinesePreference.Header" xml:space="preserve">
|
||||
<value>簡体字から繁体字へ変換</value>
|
||||
@@ -730,7 +730,7 @@
|
||||
<value>クリア</value>
|
||||
</data>
|
||||
<data name="SettingsPageClearCache.Content" xml:space="preserve">
|
||||
<value>キャッシュファイルをクリア</value>
|
||||
<value>キャッシュファイルクリア</value>
|
||||
</data>
|
||||
<data name="SettingsPageCloseStatus.Text" xml:space="preserve">
|
||||
<value>閉じる</value>
|
||||
@@ -859,7 +859,7 @@
|
||||
<value>歌詞ウィンドウを閉じたときにアプリを終了する</value>
|
||||
</data>
|
||||
<data name="SettingsPageExportPlayHistoryButton.Content" xml:space="preserve">
|
||||
<value>プレー履歴のエクスポート</value>
|
||||
<value>再生履歴をエクスポート</value>
|
||||
</data>
|
||||
<data name="SettingsPageExportSettingsButton.Content" xml:space="preserve">
|
||||
<value>設定をエクスポート</value>
|
||||
@@ -874,19 +874,19 @@
|
||||
<value>流体レイヤー</value>
|
||||
</data>
|
||||
<data name="SettingsPageFogLayer.Header" xml:space="preserve">
|
||||
<value>霧のレイヤー</value>
|
||||
<value>霧レイヤー</value>
|
||||
</data>
|
||||
<data name="SettingsPageFollowSystem.Content" xml:space="preserve">
|
||||
<value>システムに従う</value>
|
||||
</data>
|
||||
<data name="SettingsPageFontColor.Header" xml:space="preserve">
|
||||
<value>フォントの色</value>
|
||||
<value>フォント色</value>
|
||||
</data>
|
||||
<data name="SettingsPageForceAlwaysOnTop.Description" xml:space="preserve">
|
||||
<value>定期チェックで最前面表示を強制維持します</value>
|
||||
</data>
|
||||
<data name="SettingsPageForceAlwaysOnTop.Header" xml:space="preserve">
|
||||
<value>常に上部に強制的に表示</value>
|
||||
<value>常にトップに強制的に表示</value>
|
||||
</data>
|
||||
<data name="SettingsPageForceWordByWordEffect.Description" xml:space="preserve">
|
||||
<value>現在の歌詞に文字単位の情報がない場合でも、文字単位の歌詞シミュレーションをします</value>
|
||||
@@ -907,7 +907,7 @@
|
||||
<value>このアプリの翻訳に協力する 🌏</value>
|
||||
</data>
|
||||
<data name="SettingsPageHideWindow.Description" xml:space="preserve">
|
||||
<value>音楽の再生が停止した場合、自動的に歌詞ウィンドウを非表示/表示する</value>
|
||||
<value>ミュージックの再生が停止した場合、自動的に歌詞ウィンドウを非表示/表示する</value>
|
||||
</data>
|
||||
<data name="SettingsPageHideWindow.Header" xml:space="preserve">
|
||||
<value>ウィンドウの自動非表示/表示</value>
|
||||
@@ -1021,7 +1021,7 @@
|
||||
<value>現在の行の位置</value>
|
||||
</data>
|
||||
<data name="SettingsPageLyricsEffect.Text" xml:space="preserve">
|
||||
<value>歌詞エフェクト</value>
|
||||
<value>歌詞のエフェクト</value>
|
||||
</data>
|
||||
<data name="SettingsPageLyricsExtraBlack.Content" xml:space="preserve">
|
||||
<value>超極太</value>
|
||||
@@ -1099,7 +1099,7 @@
|
||||
<value>ベストマッチ</value>
|
||||
</data>
|
||||
<data name="SettingsPageLyricsSearchProvidersConfig.Text" xml:space="preserve">
|
||||
<value>歌詞元の設定</value>
|
||||
<value>歌詞ソースの設定</value>
|
||||
</data>
|
||||
<data name="SettingsPageLyricsSearchSequential.Content" xml:space="preserve">
|
||||
<value>順次</value>
|
||||
@@ -1108,7 +1108,7 @@
|
||||
<value>順次:以下のリストの優先順位に従って検索し、最初に見つかった結果を返します。ベストマッチ:有効なすべてのソースを検索し、一致スコアが最も高い結果を自動的に選択します</value>
|
||||
</data>
|
||||
<data name="SettingsPageLyricsSearchType.Header" xml:space="preserve">
|
||||
<value>歌詞検索方法</value>
|
||||
<value>歌詞検索の方法</value>
|
||||
</data>
|
||||
<data name="SettingsPageLyricsSemiBold.Content" xml:space="preserve">
|
||||
<value>中太</value>
|
||||
@@ -1117,7 +1117,7 @@
|
||||
<value>準細</value>
|
||||
</data>
|
||||
<data name="SettingsPageLyricsStyle.Text" xml:space="preserve">
|
||||
<value>歌詞スタイル</value>
|
||||
<value>歌詞のスタイル</value>
|
||||
</data>
|
||||
<data name="SettingsPageLyricsThin.Content" xml:space="preserve">
|
||||
<value>極細</value>
|
||||
@@ -1138,16 +1138,16 @@
|
||||
<value>歌詞ウィンドウマネージャー</value>
|
||||
</data>
|
||||
<data name="SettingsPageLyricsWindowSwitchHotKey.Header" xml:space="preserve">
|
||||
<value>歌詞ウィンドウ状態切り替えショートカット</value>
|
||||
<value>歌詞ウィンドウスイッチャーのショートカットキー</value>
|
||||
</data>
|
||||
<data name="SettingsPageMatchingThreshold.Description" xml:space="preserve">
|
||||
<value>この値を調整すると、順次検索とベストマッチ検索の結果に影響しますが、手動歌詞検索インターフェイスの検索結果には影響しません</value>
|
||||
</data>
|
||||
<data name="SettingsPageMatchingThreshold.Header" xml:space="preserve">
|
||||
<value>一致度の最低ライン</value>
|
||||
<value>最小一致しきい値</value>
|
||||
</data>
|
||||
<data name="SettingsPageMediaLib.Content" xml:space="preserve">
|
||||
<value>メディアライブラリ</value>
|
||||
<value>メディアライブラリー</value>
|
||||
</data>
|
||||
<data name="SettingsPageMedianCut.Content" xml:space="preserve">
|
||||
<value>保守的</value>
|
||||
@@ -1156,7 +1156,7 @@
|
||||
<value>この再生ソースを監視する</value>
|
||||
</data>
|
||||
<data name="SettingsPageMockMusicPlaying.Header" xml:space="preserve">
|
||||
<value>テスト音楽を再生</value>
|
||||
<value>テストミュージックを再生</value>
|
||||
</data>
|
||||
<data name="SettingsPageMultiNowPlayingWindows.Header" xml:space="preserve">
|
||||
<value>マルチウィンドウ モード</value>
|
||||
@@ -1171,10 +1171,10 @@
|
||||
<value>ミュージック ギャラリーが開いているため、他の再生ソースを無視します</value>
|
||||
</data>
|
||||
<data name="SettingsPageMusicLib.Description" xml:space="preserve">
|
||||
<value>音楽または歌詞が含まれるフォルダを追加</value>
|
||||
<value>ミュージックまたは歌詞が含まれるフォルダを追加</value>
|
||||
</data>
|
||||
<data name="SettingsPageMusicLib.Header" xml:space="preserve">
|
||||
<value>ローカルメディアライブラリ</value>
|
||||
<value>ローカルメディアライブラリー</value>
|
||||
</data>
|
||||
<data name="SettingsPageNarrowMode.Text" xml:space="preserve">
|
||||
<value>狭い表示モード</value>
|
||||
@@ -1213,10 +1213,10 @@
|
||||
<value>スポンサー</value>
|
||||
</data>
|
||||
<data name="SettingsPagePhonetic.Text" xml:space="preserve">
|
||||
<value>歌詞のルビ</value>
|
||||
<value>歌詞ルビ</value>
|
||||
</data>
|
||||
<data name="SettingsPagePhoneticText.Header" xml:space="preserve">
|
||||
<value>ルビのサイズ</value>
|
||||
<value>ルビ</value>
|
||||
</data>
|
||||
<data name="SettingsPagePinToTaskbar.Header" xml:space="preserve">
|
||||
<value>タスクバーにピン留め</value>
|
||||
@@ -1243,13 +1243,13 @@
|
||||
<value>"soundcloud.com" で "Cut to the Feeling" を再生</value>
|
||||
</data>
|
||||
<data name="SettingsPagePlayOrPauseSongHotKey.Header" xml:space="preserve">
|
||||
<value>再生/一時停止のショートカット</value>
|
||||
<value>再生/一時停止のショートカットキー</value>
|
||||
</data>
|
||||
<data name="SettingsPagePreviousSongHotKey.Header" xml:space="preserve">
|
||||
<value>前の曲へのショートカット</value>
|
||||
<value>次のトラックのショートカットキー</value>
|
||||
</data>
|
||||
<data name="SettingsPagePureLayer.Header" xml:space="preserve">
|
||||
<value>単色のレイヤー</value>
|
||||
<value>単色レイヤー</value>
|
||||
</data>
|
||||
<data name="SettingsPageRealtimeStatus.Text" xml:space="preserve">
|
||||
<value>リアルタイムステータス</value>
|
||||
@@ -1315,13 +1315,13 @@
|
||||
<value>設定マネージャー</value>
|
||||
</data>
|
||||
<data name="SettingsPageSettingsPlayHistory.Header" xml:space="preserve">
|
||||
<value>プレーの歴史</value>
|
||||
<value>再生履歴</value>
|
||||
</data>
|
||||
<data name="SettingsPageShareHub.Content" xml:space="preserve">
|
||||
<value>オンライン共有センターを閲覧する</value>
|
||||
</data>
|
||||
<data name="SettingsPageShortcut.Text" xml:space="preserve">
|
||||
<value>ショートカット</value>
|
||||
<value>ショートカットキー</value>
|
||||
</data>
|
||||
<data name="SettingsPageShortcutRegFailInfo" xml:space="preserve">
|
||||
<value>ホットキーの登録に失敗しました</value>
|
||||
@@ -1336,7 +1336,7 @@
|
||||
<value>アーティストを表示</value>
|
||||
</data>
|
||||
<data name="SettingsPageShowHideHotKey.Header" xml:space="preserve">
|
||||
<value>歌詞ウィンドウの表示/非表示ショートカット</value>
|
||||
<value>歌詞ウィンドウの表示/非表示のショートカットキー</value>
|
||||
</data>
|
||||
<data name="SettingsPageShowInSwitchers.Description" xml:space="preserve">
|
||||
<value>例: Alt + Tab、タスクバー</value>
|
||||
@@ -1351,7 +1351,7 @@
|
||||
<value>スライド</value>
|
||||
</data>
|
||||
<data name="SettingsPageSnowFlakeLayer.Header" xml:space="preserve">
|
||||
<value>雪のレイヤー</value>
|
||||
<value>雪レイヤー</value>
|
||||
</data>
|
||||
<data name="SettingsPageSongInfo.Text" xml:space="preserve">
|
||||
<value>楽曲情報</value>
|
||||
@@ -1393,7 +1393,7 @@
|
||||
<value>スタートアップ</value>
|
||||
</data>
|
||||
<data name="SettingsPageStats.Content" xml:space="preserve">
|
||||
<value>統計</value>
|
||||
<value>統計データ</value>
|
||||
</data>
|
||||
<data name="SettingsPageStopTrackOnGalleryWindowClosed.Header" xml:space="preserve">
|
||||
<value>ミュージックギャラリーウィンドウを閉じたときに再生を停止する</value>
|
||||
@@ -1435,7 +1435,7 @@
|
||||
<value>訳文</value>
|
||||
</data>
|
||||
<data name="SettingsPageTranslation.Text" xml:space="preserve">
|
||||
<value>歌詞の翻訳</value>
|
||||
<value>歌詞翻訳</value>
|
||||
</data>
|
||||
<data name="SettingsPageTranslationConfig.Header" xml:space="preserve">
|
||||
<value>LibreTranslate サービス</value>
|
||||
@@ -1467,22 +1467,46 @@
|
||||
<data name="StandardMode" xml:space="preserve">
|
||||
<value>標準モード</value>
|
||||
</data>
|
||||
<data name="StatsDashboardControlSources.Text" xml:space="preserve">
|
||||
<value>情報源</value>
|
||||
<data name="StatsDashboardControlActivityByHour.Text" xml:space="preserve">
|
||||
<value>時間帯別アクティビティ</value>
|
||||
</data>
|
||||
<data name="StatsDashboardControlThisMonth.Header" xml:space="preserve">
|
||||
<data name="StatsDashboardControlCustom.Content" xml:space="preserve">
|
||||
<value>カスタム</value>
|
||||
</data>
|
||||
<data name="StatsDashboardControlEnd.Header" xml:space="preserve">
|
||||
<value>終了</value>
|
||||
</data>
|
||||
<data name="StatsDashboardControlLeastActive.Text" xml:space="preserve">
|
||||
<value>最少アクティブ</value>
|
||||
</data>
|
||||
<data name="StatsDashboardControlMostActive.Text" xml:space="preserve">
|
||||
<value>最多アクティブ</value>
|
||||
</data>
|
||||
<data name="StatsDashboardControlSources.Text" xml:space="preserve">
|
||||
<value>再生ソース</value>
|
||||
</data>
|
||||
<data name="StatsDashboardControlStart.Header" xml:space="preserve">
|
||||
<value>開始</value>
|
||||
</data>
|
||||
<data name="StatsDashboardControlThisMonth.Content" xml:space="preserve">
|
||||
<value>今月</value>
|
||||
</data>
|
||||
<data name="StatsDashboardControlThisQuarter.Header" xml:space="preserve">
|
||||
<data name="StatsDashboardControlThisQuarter.Content" xml:space="preserve">
|
||||
<value>今期</value>
|
||||
</data>
|
||||
<data name="StatsDashboardControlThisWeek.Header" xml:space="preserve">
|
||||
<data name="StatsDashboardControlThisWeek.Content" xml:space="preserve">
|
||||
<value>今週</value>
|
||||
</data>
|
||||
<data name="StatsDashboardControlThisYear.Header" xml:space="preserve">
|
||||
<data name="StatsDashboardControlThisYear.Content" xml:space="preserve">
|
||||
<value>今年</value>
|
||||
</data>
|
||||
<data name="StatsDashboardControlToday.Header" xml:space="preserve">
|
||||
<data name="StatsDashboardControlTimeRange.Header" xml:space="preserve">
|
||||
<value>期間</value>
|
||||
</data>
|
||||
<data name="StatsDashboardControlTimes" xml:space="preserve">
|
||||
<value>タイムズ</value>
|
||||
</data>
|
||||
<data name="StatsDashboardControlToday.Content" xml:space="preserve">
|
||||
<value>今日</value>
|
||||
</data>
|
||||
<data name="StatsDashboardControlTopArtists.Text" xml:space="preserve">
|
||||
@@ -1492,13 +1516,19 @@
|
||||
<value>トップトラック</value>
|
||||
</data>
|
||||
<data name="StatsDashboardControlTopSource.Text" xml:space="preserve">
|
||||
<value>トップ・ソース</value>
|
||||
<value>よく使う再生ソース</value>
|
||||
</data>
|
||||
<data name="StatsDashboardControlTotalDuration.Text" xml:space="preserve">
|
||||
<value>総所要時間</value>
|
||||
<value>総再生時間</value>
|
||||
</data>
|
||||
<data name="StatsDashboardControlTrackCountAxis.AxisName" xml:space="preserve">
|
||||
<value>タイムズ</value>
|
||||
</data>
|
||||
<data name="StatsDashboardControlTrackCountText.Text" xml:space="preserve">
|
||||
<value>タイムズ</value>
|
||||
</data>
|
||||
<data name="StatsDashboardControlTracksPlayed.Text" xml:space="preserve">
|
||||
<value>演奏曲目</value>
|
||||
<value>再生された曲の数</value>
|
||||
</data>
|
||||
<data name="SystemTrayExit.Text" xml:space="preserve">
|
||||
<value>終了</value>
|
||||
@@ -1516,13 +1546,13 @@
|
||||
<value>再起動</value>
|
||||
</data>
|
||||
<data name="SystemTraySearch.Text" xml:space="preserve">
|
||||
<value>歌詞の検索ウィンドウ</value>
|
||||
<value>歌詞検索ウィンドウ</value>
|
||||
</data>
|
||||
<data name="SystemTraySettings.Text" xml:space="preserve">
|
||||
<value>設定を開く</value>
|
||||
</data>
|
||||
<data name="SystemTraySwitch.Text" xml:space="preserve">
|
||||
<value>歌詞ウィンドウ切り替え</value>
|
||||
<value>歌詞ウィンドウスイッチャー</value>
|
||||
</data>
|
||||
<data name="TaskbarMode" xml:space="preserve">
|
||||
<value>タスクバー モード</value>
|
||||
|
||||
@@ -1467,22 +1467,46 @@
|
||||
<data name="StandardMode" xml:space="preserve">
|
||||
<value>표준 모드</value>
|
||||
</data>
|
||||
<data name="StatsDashboardControlActivityByHour.Text" xml:space="preserve">
|
||||
<value>시간별 활동</value>
|
||||
</data>
|
||||
<data name="StatsDashboardControlCustom.Content" xml:space="preserve">
|
||||
<value>사용자 지정</value>
|
||||
</data>
|
||||
<data name="StatsDashboardControlEnd.Header" xml:space="preserve">
|
||||
<value>종료</value>
|
||||
</data>
|
||||
<data name="StatsDashboardControlLeastActive.Text" xml:space="preserve">
|
||||
<value>최소 활성</value>
|
||||
</data>
|
||||
<data name="StatsDashboardControlMostActive.Text" xml:space="preserve">
|
||||
<value>가장 활동적인</value>
|
||||
</data>
|
||||
<data name="StatsDashboardControlSources.Text" xml:space="preserve">
|
||||
<value>출처</value>
|
||||
</data>
|
||||
<data name="StatsDashboardControlThisMonth.Header" xml:space="preserve">
|
||||
<data name="StatsDashboardControlStart.Header" xml:space="preserve">
|
||||
<value>시작</value>
|
||||
</data>
|
||||
<data name="StatsDashboardControlThisMonth.Content" xml:space="preserve">
|
||||
<value>이번 달</value>
|
||||
</data>
|
||||
<data name="StatsDashboardControlThisQuarter.Header" xml:space="preserve">
|
||||
<data name="StatsDashboardControlThisQuarter.Content" xml:space="preserve">
|
||||
<value>이번 분기</value>
|
||||
</data>
|
||||
<data name="StatsDashboardControlThisWeek.Header" xml:space="preserve">
|
||||
<data name="StatsDashboardControlThisWeek.Content" xml:space="preserve">
|
||||
<value>이번 주</value>
|
||||
</data>
|
||||
<data name="StatsDashboardControlThisYear.Header" xml:space="preserve">
|
||||
<data name="StatsDashboardControlThisYear.Content" xml:space="preserve">
|
||||
<value>올해</value>
|
||||
</data>
|
||||
<data name="StatsDashboardControlToday.Header" xml:space="preserve">
|
||||
<data name="StatsDashboardControlTimeRange.Header" xml:space="preserve">
|
||||
<value>시간 범위</value>
|
||||
</data>
|
||||
<data name="StatsDashboardControlTimes" xml:space="preserve">
|
||||
<value>시간</value>
|
||||
</data>
|
||||
<data name="StatsDashboardControlToday.Content" xml:space="preserve">
|
||||
<value>오늘</value>
|
||||
</data>
|
||||
<data name="StatsDashboardControlTopArtists.Text" xml:space="preserve">
|
||||
@@ -1497,6 +1521,12 @@
|
||||
<data name="StatsDashboardControlTotalDuration.Text" xml:space="preserve">
|
||||
<value>총 기간</value>
|
||||
</data>
|
||||
<data name="StatsDashboardControlTrackCountAxis.AxisName" xml:space="preserve">
|
||||
<value>시간</value>
|
||||
</data>
|
||||
<data name="StatsDashboardControlTrackCountText.Text" xml:space="preserve">
|
||||
<value>시간</value>
|
||||
</data>
|
||||
<data name="StatsDashboardControlTracksPlayed.Text" xml:space="preserve">
|
||||
<value>재생된 트랙</value>
|
||||
</data>
|
||||
|
||||
@@ -1467,22 +1467,46 @@
|
||||
<data name="StandardMode" xml:space="preserve">
|
||||
<value>Mod Standard</value>
|
||||
</data>
|
||||
<data name="StatsDashboardControlActivityByHour.Text" xml:space="preserve">
|
||||
<value>Aktiviti mengikut Jam</value>
|
||||
</data>
|
||||
<data name="StatsDashboardControlCustom.Content" xml:space="preserve">
|
||||
<value>Tersuai</value>
|
||||
</data>
|
||||
<data name="StatsDashboardControlEnd.Header" xml:space="preserve">
|
||||
<value>Penamat</value>
|
||||
</data>
|
||||
<data name="StatsDashboardControlLeastActive.Text" xml:space="preserve">
|
||||
<value>Kurang Aktif</value>
|
||||
</data>
|
||||
<data name="StatsDashboardControlMostActive.Text" xml:space="preserve">
|
||||
<value>Paling Aktif</value>
|
||||
</data>
|
||||
<data name="StatsDashboardControlSources.Text" xml:space="preserve">
|
||||
<value>Sumber</value>
|
||||
</data>
|
||||
<data name="StatsDashboardControlThisMonth.Header" xml:space="preserve">
|
||||
<data name="StatsDashboardControlStart.Header" xml:space="preserve">
|
||||
<value>Mula</value>
|
||||
</data>
|
||||
<data name="StatsDashboardControlThisMonth.Content" xml:space="preserve">
|
||||
<value>Bulan Ini</value>
|
||||
</data>
|
||||
<data name="StatsDashboardControlThisQuarter.Header" xml:space="preserve">
|
||||
<value>Suku Tahun Ini</value>
|
||||
<data name="StatsDashboardControlThisQuarter.Content" xml:space="preserve">
|
||||
<value>Suku ini</value>
|
||||
</data>
|
||||
<data name="StatsDashboardControlThisWeek.Header" xml:space="preserve">
|
||||
<data name="StatsDashboardControlThisWeek.Content" xml:space="preserve">
|
||||
<value>Minggu Ini</value>
|
||||
</data>
|
||||
<data name="StatsDashboardControlThisYear.Header" xml:space="preserve">
|
||||
<value>Tahun Ini</value>
|
||||
<data name="StatsDashboardControlThisYear.Content" xml:space="preserve">
|
||||
<value>Tahun ini</value>
|
||||
</data>
|
||||
<data name="StatsDashboardControlToday.Header" xml:space="preserve">
|
||||
<data name="StatsDashboardControlTimeRange.Header" xml:space="preserve">
|
||||
<value>Julat masa</value>
|
||||
</data>
|
||||
<data name="StatsDashboardControlTimes" xml:space="preserve">
|
||||
<value>Kelas kedua</value>
|
||||
</data>
|
||||
<data name="StatsDashboardControlToday.Content" xml:space="preserve">
|
||||
<value>Hari ini</value>
|
||||
</data>
|
||||
<data name="StatsDashboardControlTopArtists.Text" xml:space="preserve">
|
||||
@@ -1497,6 +1521,12 @@
|
||||
<data name="StatsDashboardControlTotalDuration.Text" xml:space="preserve">
|
||||
<value>Jumlah Tempoh</value>
|
||||
</data>
|
||||
<data name="StatsDashboardControlTrackCountAxis.AxisName" xml:space="preserve">
|
||||
<value>Kelas kedua</value>
|
||||
</data>
|
||||
<data name="StatsDashboardControlTrackCountText.Text" xml:space="preserve">
|
||||
<value>Kelas kedua</value>
|
||||
</data>
|
||||
<data name="StatsDashboardControlTracksPlayed.Text" xml:space="preserve">
|
||||
<value>Trek Dimainkan</value>
|
||||
</data>
|
||||
|
||||
@@ -1467,22 +1467,46 @@
|
||||
<data name="StandardMode" xml:space="preserve">
|
||||
<value>Modo Padrão</value>
|
||||
</data>
|
||||
<data name="StatsDashboardControlActivityByHour.Text" xml:space="preserve">
|
||||
<value>Atividade por hora</value>
|
||||
</data>
|
||||
<data name="StatsDashboardControlCustom.Content" xml:space="preserve">
|
||||
<value>Personalizado</value>
|
||||
</data>
|
||||
<data name="StatsDashboardControlEnd.Header" xml:space="preserve">
|
||||
<value>Fim</value>
|
||||
</data>
|
||||
<data name="StatsDashboardControlLeastActive.Text" xml:space="preserve">
|
||||
<value>Menos ativo</value>
|
||||
</data>
|
||||
<data name="StatsDashboardControlMostActive.Text" xml:space="preserve">
|
||||
<value>Mais activos</value>
|
||||
</data>
|
||||
<data name="StatsDashboardControlSources.Text" xml:space="preserve">
|
||||
<value>Fontes</value>
|
||||
</data>
|
||||
<data name="StatsDashboardControlThisMonth.Header" xml:space="preserve">
|
||||
<data name="StatsDashboardControlStart.Header" xml:space="preserve">
|
||||
<value>Início</value>
|
||||
</data>
|
||||
<data name="StatsDashboardControlThisMonth.Content" xml:space="preserve">
|
||||
<value>Este mês</value>
|
||||
</data>
|
||||
<data name="StatsDashboardControlThisQuarter.Header" xml:space="preserve">
|
||||
<data name="StatsDashboardControlThisQuarter.Content" xml:space="preserve">
|
||||
<value>Este trimestre</value>
|
||||
</data>
|
||||
<data name="StatsDashboardControlThisWeek.Header" xml:space="preserve">
|
||||
<data name="StatsDashboardControlThisWeek.Content" xml:space="preserve">
|
||||
<value>Esta semana</value>
|
||||
</data>
|
||||
<data name="StatsDashboardControlThisYear.Header" xml:space="preserve">
|
||||
<data name="StatsDashboardControlThisYear.Content" xml:space="preserve">
|
||||
<value>Este ano</value>
|
||||
</data>
|
||||
<data name="StatsDashboardControlToday.Header" xml:space="preserve">
|
||||
<data name="StatsDashboardControlTimeRange.Header" xml:space="preserve">
|
||||
<value>Intervalo de tempo</value>
|
||||
</data>
|
||||
<data name="StatsDashboardControlTimes" xml:space="preserve">
|
||||
<value>Tempos</value>
|
||||
</data>
|
||||
<data name="StatsDashboardControlToday.Content" xml:space="preserve">
|
||||
<value>Hoje</value>
|
||||
</data>
|
||||
<data name="StatsDashboardControlTopArtists.Text" xml:space="preserve">
|
||||
@@ -1497,6 +1521,12 @@
|
||||
<data name="StatsDashboardControlTotalDuration.Text" xml:space="preserve">
|
||||
<value>Duração total</value>
|
||||
</data>
|
||||
<data name="StatsDashboardControlTrackCountAxis.AxisName" xml:space="preserve">
|
||||
<value>Tempos</value>
|
||||
</data>
|
||||
<data name="StatsDashboardControlTrackCountText.Text" xml:space="preserve">
|
||||
<value>Tempos</value>
|
||||
</data>
|
||||
<data name="StatsDashboardControlTracksPlayed.Text" xml:space="preserve">
|
||||
<value>Faixas reproduzidas</value>
|
||||
</data>
|
||||
|
||||
@@ -1467,22 +1467,46 @@
|
||||
<data name="StandardMode" xml:space="preserve">
|
||||
<value>Стандартный режим</value>
|
||||
</data>
|
||||
<data name="StatsDashboardControlActivityByHour.Text" xml:space="preserve">
|
||||
<value>Активность по часам</value>
|
||||
</data>
|
||||
<data name="StatsDashboardControlCustom.Content" xml:space="preserve">
|
||||
<value>Пользовательское</value>
|
||||
</data>
|
||||
<data name="StatsDashboardControlEnd.Header" xml:space="preserve">
|
||||
<value>Конец</value>
|
||||
</data>
|
||||
<data name="StatsDashboardControlLeastActive.Text" xml:space="preserve">
|
||||
<value>Наименее активный</value>
|
||||
</data>
|
||||
<data name="StatsDashboardControlMostActive.Text" xml:space="preserve">
|
||||
<value>Самые активные</value>
|
||||
</data>
|
||||
<data name="StatsDashboardControlSources.Text" xml:space="preserve">
|
||||
<value>Источники</value>
|
||||
</data>
|
||||
<data name="StatsDashboardControlThisMonth.Header" xml:space="preserve">
|
||||
<data name="StatsDashboardControlStart.Header" xml:space="preserve">
|
||||
<value>Начало</value>
|
||||
</data>
|
||||
<data name="StatsDashboardControlThisMonth.Content" xml:space="preserve">
|
||||
<value>Этот месяц</value>
|
||||
</data>
|
||||
<data name="StatsDashboardControlThisQuarter.Header" xml:space="preserve">
|
||||
<data name="StatsDashboardControlThisQuarter.Content" xml:space="preserve">
|
||||
<value>Этот квартал</value>
|
||||
</data>
|
||||
<data name="StatsDashboardControlThisWeek.Header" xml:space="preserve">
|
||||
<data name="StatsDashboardControlThisWeek.Content" xml:space="preserve">
|
||||
<value>На этой неделе</value>
|
||||
</data>
|
||||
<data name="StatsDashboardControlThisYear.Header" xml:space="preserve">
|
||||
<data name="StatsDashboardControlThisYear.Content" xml:space="preserve">
|
||||
<value>В этом году</value>
|
||||
</data>
|
||||
<data name="StatsDashboardControlToday.Header" xml:space="preserve">
|
||||
<data name="StatsDashboardControlTimeRange.Header" xml:space="preserve">
|
||||
<value>Диапазон времени</value>
|
||||
</data>
|
||||
<data name="StatsDashboardControlTimes" xml:space="preserve">
|
||||
<value>Times</value>
|
||||
</data>
|
||||
<data name="StatsDashboardControlToday.Content" xml:space="preserve">
|
||||
<value>Сегодня</value>
|
||||
</data>
|
||||
<data name="StatsDashboardControlTopArtists.Text" xml:space="preserve">
|
||||
@@ -1497,6 +1521,12 @@
|
||||
<data name="StatsDashboardControlTotalDuration.Text" xml:space="preserve">
|
||||
<value>Общая продолжительность</value>
|
||||
</data>
|
||||
<data name="StatsDashboardControlTrackCountAxis.AxisName" xml:space="preserve">
|
||||
<value>Times</value>
|
||||
</data>
|
||||
<data name="StatsDashboardControlTrackCountText.Text" xml:space="preserve">
|
||||
<value>Times</value>
|
||||
</data>
|
||||
<data name="StatsDashboardControlTracksPlayed.Text" xml:space="preserve">
|
||||
<value>Воспроизведенные треки</value>
|
||||
</data>
|
||||
|
||||
@@ -1467,22 +1467,46 @@
|
||||
<data name="StandardMode" xml:space="preserve">
|
||||
<value>โหมดมาตรฐาน</value>
|
||||
</data>
|
||||
<data name="StatsDashboardControlActivityByHour.Text" xml:space="preserve">
|
||||
<value>กิจกรรมตามชั่วโมง</value>
|
||||
</data>
|
||||
<data name="StatsDashboardControlCustom.Content" xml:space="preserve">
|
||||
<value>กำหนดเอง</value>
|
||||
</data>
|
||||
<data name="StatsDashboardControlEnd.Header" xml:space="preserve">
|
||||
<value>สิ้นสุด</value>
|
||||
</data>
|
||||
<data name="StatsDashboardControlLeastActive.Text" xml:space="preserve">
|
||||
<value>น้อยที่สุด</value>
|
||||
</data>
|
||||
<data name="StatsDashboardControlMostActive.Text" xml:space="preserve">
|
||||
<value>กิจกรรมล่าสุด</value>
|
||||
</data>
|
||||
<data name="StatsDashboardControlSources.Text" xml:space="preserve">
|
||||
<value>แหล่งข้อมูล</value>
|
||||
</data>
|
||||
<data name="StatsDashboardControlThisMonth.Header" xml:space="preserve">
|
||||
<data name="StatsDashboardControlStart.Header" xml:space="preserve">
|
||||
<value>เริ่มต้น</value>
|
||||
</data>
|
||||
<data name="StatsDashboardControlThisMonth.Content" xml:space="preserve">
|
||||
<value>เดือนนี้</value>
|
||||
</data>
|
||||
<data name="StatsDashboardControlThisQuarter.Header" xml:space="preserve">
|
||||
<data name="StatsDashboardControlThisQuarter.Content" xml:space="preserve">
|
||||
<value>ไตรมาสนี้</value>
|
||||
</data>
|
||||
<data name="StatsDashboardControlThisWeek.Header" xml:space="preserve">
|
||||
<data name="StatsDashboardControlThisWeek.Content" xml:space="preserve">
|
||||
<value>สัปดาห์นี้</value>
|
||||
</data>
|
||||
<data name="StatsDashboardControlThisYear.Header" xml:space="preserve">
|
||||
<data name="StatsDashboardControlThisYear.Content" xml:space="preserve">
|
||||
<value>ปีนี้</value>
|
||||
</data>
|
||||
<data name="StatsDashboardControlToday.Header" xml:space="preserve">
|
||||
<data name="StatsDashboardControlTimeRange.Header" xml:space="preserve">
|
||||
<value>ช่วงเวลา</value>
|
||||
</data>
|
||||
<data name="StatsDashboardControlTimes" xml:space="preserve">
|
||||
<value>เวลา</value>
|
||||
</data>
|
||||
<data name="StatsDashboardControlToday.Content" xml:space="preserve">
|
||||
<value>วันนี้</value>
|
||||
</data>
|
||||
<data name="StatsDashboardControlTopArtists.Text" xml:space="preserve">
|
||||
@@ -1497,6 +1521,12 @@
|
||||
<data name="StatsDashboardControlTotalDuration.Text" xml:space="preserve">
|
||||
<value>ระยะเวลาทั้งหมด</value>
|
||||
</data>
|
||||
<data name="StatsDashboardControlTrackCountAxis.AxisName" xml:space="preserve">
|
||||
<value>เวลา</value>
|
||||
</data>
|
||||
<data name="StatsDashboardControlTrackCountText.Text" xml:space="preserve">
|
||||
<value>เวลา</value>
|
||||
</data>
|
||||
<data name="StatsDashboardControlTracksPlayed.Text" xml:space="preserve">
|
||||
<value>เพลงที่เล่น</value>
|
||||
</data>
|
||||
|
||||
@@ -1467,22 +1467,46 @@
|
||||
<data name="StandardMode" xml:space="preserve">
|
||||
<value>Chế độ tiêu chuẩn</value>
|
||||
</data>
|
||||
<data name="StatsDashboardControlActivityByHour.Text" xml:space="preserve">
|
||||
<value>Hoạt động theo giờ</value>
|
||||
</data>
|
||||
<data name="StatsDashboardControlCustom.Content" xml:space="preserve">
|
||||
<value>Tùy chỉnh</value>
|
||||
</data>
|
||||
<data name="StatsDashboardControlEnd.Header" xml:space="preserve">
|
||||
<value>Kết thúc</value>
|
||||
</data>
|
||||
<data name="StatsDashboardControlLeastActive.Text" xml:space="preserve">
|
||||
<value>Hoạt động ít nhất</value>
|
||||
</data>
|
||||
<data name="StatsDashboardControlMostActive.Text" xml:space="preserve">
|
||||
<value>Hoạt động nhiều nhất</value>
|
||||
</data>
|
||||
<data name="StatsDashboardControlSources.Text" xml:space="preserve">
|
||||
<value>Nguồn</value>
|
||||
</data>
|
||||
<data name="StatsDashboardControlThisMonth.Header" xml:space="preserve">
|
||||
<data name="StatsDashboardControlStart.Header" xml:space="preserve">
|
||||
<value>Bắt đầu</value>
|
||||
</data>
|
||||
<data name="StatsDashboardControlThisMonth.Content" xml:space="preserve">
|
||||
<value>Tháng này</value>
|
||||
</data>
|
||||
<data name="StatsDashboardControlThisQuarter.Header" xml:space="preserve">
|
||||
<data name="StatsDashboardControlThisQuarter.Content" xml:space="preserve">
|
||||
<value>Quý này</value>
|
||||
</data>
|
||||
<data name="StatsDashboardControlThisWeek.Header" xml:space="preserve">
|
||||
<data name="StatsDashboardControlThisWeek.Content" xml:space="preserve">
|
||||
<value>Tuần này</value>
|
||||
</data>
|
||||
<data name="StatsDashboardControlThisYear.Header" xml:space="preserve">
|
||||
<data name="StatsDashboardControlThisYear.Content" xml:space="preserve">
|
||||
<value>Năm nay</value>
|
||||
</data>
|
||||
<data name="StatsDashboardControlToday.Header" xml:space="preserve">
|
||||
<data name="StatsDashboardControlTimeRange.Header" xml:space="preserve">
|
||||
<value>Khoảng thời gian</value>
|
||||
</data>
|
||||
<data name="StatsDashboardControlTimes" xml:space="preserve">
|
||||
<value>Thời gian</value>
|
||||
</data>
|
||||
<data name="StatsDashboardControlToday.Content" xml:space="preserve">
|
||||
<value>Hôm nay</value>
|
||||
</data>
|
||||
<data name="StatsDashboardControlTopArtists.Text" xml:space="preserve">
|
||||
@@ -1497,6 +1521,12 @@
|
||||
<data name="StatsDashboardControlTotalDuration.Text" xml:space="preserve">
|
||||
<value>Thời gian tổng cộng</value>
|
||||
</data>
|
||||
<data name="StatsDashboardControlTrackCountAxis.AxisName" xml:space="preserve">
|
||||
<value>Thời gian</value>
|
||||
</data>
|
||||
<data name="StatsDashboardControlTrackCountText.Text" xml:space="preserve">
|
||||
<value>Thời gian</value>
|
||||
</data>
|
||||
<data name="StatsDashboardControlTracksPlayed.Text" xml:space="preserve">
|
||||
<value>Các bài hát đã phát</value>
|
||||
</data>
|
||||
|
||||
@@ -59,46 +59,46 @@
|
||||
: using a System.ComponentModel.TypeConverter
|
||||
: and then encoded with base64 encoding.
|
||||
-->
|
||||
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
|
||||
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
|
||||
<xsd:schema xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata" id="root">
|
||||
<xsd:import namespace="http://www.w3.org/XML/1998/namespace"/>
|
||||
<xsd:element name="root" msdata:IsDataSet="true">
|
||||
<xsd:complexType>
|
||||
<xsd:choice maxOccurs="unbounded">
|
||||
<xsd:element name="metadata">
|
||||
<xsd:complexType>
|
||||
<xsd:sequence>
|
||||
<xsd:element name="value" type="xsd:string" minOccurs="0" />
|
||||
<xsd:element name="value" type="xsd:string" minOccurs="0"/>
|
||||
</xsd:sequence>
|
||||
<xsd:attribute name="name" use="required" type="xsd:string" />
|
||||
<xsd:attribute name="type" type="xsd:string" />
|
||||
<xsd:attribute name="mimetype" type="xsd:string" />
|
||||
<xsd:attribute ref="xml:space" />
|
||||
<xsd:attribute name="name" use="required" type="xsd:string"/>
|
||||
<xsd:attribute name="type" type="xsd:string"/>
|
||||
<xsd:attribute name="mimetype" type="xsd:string"/>
|
||||
<xsd:attribute ref="xml:space"/>
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
<xsd:element name="assembly">
|
||||
<xsd:complexType>
|
||||
<xsd:attribute name="alias" type="xsd:string" />
|
||||
<xsd:attribute name="name" type="xsd:string" />
|
||||
<xsd:attribute name="alias" type="xsd:string"/>
|
||||
<xsd:attribute name="name" type="xsd:string"/>
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
<xsd:element name="data">
|
||||
<xsd:complexType>
|
||||
<xsd:sequence>
|
||||
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
|
||||
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
|
||||
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1"/>
|
||||
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2"/>
|
||||
</xsd:sequence>
|
||||
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
|
||||
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
|
||||
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
|
||||
<xsd:attribute ref="xml:space" />
|
||||
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1"/>
|
||||
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3"/>
|
||||
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4"/>
|
||||
<xsd:attribute ref="xml:space"/>
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
<xsd:element name="resheader">
|
||||
<xsd:complexType>
|
||||
<xsd:sequence>
|
||||
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
|
||||
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1"/>
|
||||
</xsd:sequence>
|
||||
<xsd:attribute name="name" type="xsd:string" use="required" />
|
||||
<xsd:attribute name="name" type="xsd:string" use="required"/>
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
</xsd:choice>
|
||||
@@ -418,7 +418,7 @@
|
||||
<value>正在同步媒体库...</value>
|
||||
</data>
|
||||
<data name="MusicGalleryPageDataSyncError.Message" xml:space="preserve">
|
||||
<value>同步媒体库时出现问题</value>
|
||||
<value>媒体库同步出现问题</value>
|
||||
</data>
|
||||
<data name="MusicGalleryPageEmptyPlayingQueue.Text" xml:space="preserve">
|
||||
<value>清除播放队列</value>
|
||||
@@ -859,7 +859,7 @@
|
||||
<value>关闭歌词窗口时退出程序</value>
|
||||
</data>
|
||||
<data name="SettingsPageExportPlayHistoryButton.Content" xml:space="preserve">
|
||||
<value />
|
||||
<value>导出播放记录</value>
|
||||
</data>
|
||||
<data name="SettingsPageExportSettingsButton.Content" xml:space="preserve">
|
||||
<value>导出设置</value>
|
||||
@@ -1314,6 +1314,9 @@
|
||||
<data name="SettingsPageSettingsManager.Header" xml:space="preserve">
|
||||
<value>设置管理器</value>
|
||||
</data>
|
||||
<data name="SettingsPageSettingsPlayHistory.Header" xml:space="preserve">
|
||||
<value>播放记录</value>
|
||||
</data>
|
||||
<data name="SettingsPageShareHub.Content" xml:space="preserve">
|
||||
<value>浏览在线资源共享中心</value>
|
||||
</data>
|
||||
@@ -1390,7 +1393,7 @@
|
||||
<value>启动</value>
|
||||
</data>
|
||||
<data name="SettingsPageStats.Content" xml:space="preserve">
|
||||
<value>统计数据</value>
|
||||
<value>音乐报告</value>
|
||||
</data>
|
||||
<data name="SettingsPageStopTrackOnGalleryWindowClosed.Header" xml:space="preserve">
|
||||
<value>关闭音乐库窗口时停止播放</value>
|
||||
@@ -1464,38 +1467,68 @@
|
||||
<data name="StandardMode" xml:space="preserve">
|
||||
<value>标准模式</value>
|
||||
</data>
|
||||
<data name="StatsDashboardControlActivityByHour.Text" xml:space="preserve">
|
||||
<value>活跃时段</value>
|
||||
</data>
|
||||
<data name="StatsDashboardControlCustom.Content" xml:space="preserve">
|
||||
<value>自定义</value>
|
||||
</data>
|
||||
<data name="StatsDashboardControlEnd.Header" xml:space="preserve">
|
||||
<value>结束</value>
|
||||
</data>
|
||||
<data name="StatsDashboardControlLeastActive.Text" xml:space="preserve">
|
||||
<value>最不活跃时段</value>
|
||||
</data>
|
||||
<data name="StatsDashboardControlMostActive.Text" xml:space="preserve">
|
||||
<value>最活跃时段</value>
|
||||
</data>
|
||||
<data name="StatsDashboardControlSources.Text" xml:space="preserve">
|
||||
<value>播放源</value>
|
||||
</data>
|
||||
<data name="StatsDashboardControlThisMonth.Header" xml:space="preserve">
|
||||
<data name="StatsDashboardControlStart.Header" xml:space="preserve">
|
||||
<value>开始</value>
|
||||
</data>
|
||||
<data name="StatsDashboardControlThisMonth.Content" xml:space="preserve">
|
||||
<value>本月</value>
|
||||
</data>
|
||||
<data name="StatsDashboardControlThisQuarter.Header" xml:space="preserve">
|
||||
<data name="StatsDashboardControlThisQuarter.Content" xml:space="preserve">
|
||||
<value>本季度</value>
|
||||
</data>
|
||||
<data name="StatsDashboardControlThisWeek.Header" xml:space="preserve">
|
||||
<data name="StatsDashboardControlThisWeek.Content" xml:space="preserve">
|
||||
<value>本周</value>
|
||||
</data>
|
||||
<data name="StatsDashboardControlThisYear.Header" xml:space="preserve">
|
||||
<data name="StatsDashboardControlThisYear.Content" xml:space="preserve">
|
||||
<value>本年度</value>
|
||||
</data>
|
||||
<data name="StatsDashboardControlToday.Header" xml:space="preserve">
|
||||
<data name="StatsDashboardControlTimeRange.Header" xml:space="preserve">
|
||||
<value>时间范围</value>
|
||||
</data>
|
||||
<data name="StatsDashboardControlTimes" xml:space="preserve">
|
||||
<value>次</value>
|
||||
</data>
|
||||
<data name="StatsDashboardControlToday.Content" xml:space="preserve">
|
||||
<value>今日</value>
|
||||
</data>
|
||||
<data name="StatsDashboardControlTopArtists.Text" xml:space="preserve">
|
||||
<value>最热爱的艺人</value>
|
||||
<value>常听的歌手</value>
|
||||
</data>
|
||||
<data name="StatsDashboardControlTopSongs.Text" xml:space="preserve">
|
||||
<value>最喜欢的歌曲</value>
|
||||
<value>常听的曲目</value>
|
||||
</data>
|
||||
<data name="StatsDashboardControlTopSource.Text" xml:space="preserve">
|
||||
<value>最常用的播放源</value>
|
||||
<value>常用的播放源</value>
|
||||
</data>
|
||||
<data name="StatsDashboardControlTotalDuration.Text" xml:space="preserve">
|
||||
<value>总时长</value>
|
||||
</data>
|
||||
<data name="StatsDashboardControlTrackCountAxis.AxisName" xml:space="preserve">
|
||||
<value>次</value>
|
||||
</data>
|
||||
<data name="StatsDashboardControlTrackCountText.Text" xml:space="preserve">
|
||||
<value>次</value>
|
||||
</data>
|
||||
<data name="StatsDashboardControlTracksPlayed.Text" xml:space="preserve">
|
||||
<value>播放的曲目</value>
|
||||
<value>已播放的曲目数</value>
|
||||
</data>
|
||||
<data name="SystemTrayExit.Text" xml:space="preserve">
|
||||
<value>退出程序</value>
|
||||
|
||||
@@ -1467,36 +1467,66 @@
|
||||
<data name="StandardMode" xml:space="preserve">
|
||||
<value>標準模式</value>
|
||||
</data>
|
||||
<data name="StatsDashboardControlActivityByHour.Text" xml:space="preserve">
|
||||
<value>每小時的活動</value>
|
||||
</data>
|
||||
<data name="StatsDashboardControlCustom.Content" xml:space="preserve">
|
||||
<value>自訂</value>
|
||||
</data>
|
||||
<data name="StatsDashboardControlEnd.Header" xml:space="preserve">
|
||||
<value>結束</value>
|
||||
</data>
|
||||
<data name="StatsDashboardControlLeastActive.Text" xml:space="preserve">
|
||||
<value>最不活躍</value>
|
||||
</data>
|
||||
<data name="StatsDashboardControlMostActive.Text" xml:space="preserve">
|
||||
<value>最活躍</value>
|
||||
</data>
|
||||
<data name="StatsDashboardControlSources.Text" xml:space="preserve">
|
||||
<value>來源</value>
|
||||
</data>
|
||||
<data name="StatsDashboardControlThisMonth.Header" xml:space="preserve">
|
||||
<data name="StatsDashboardControlStart.Header" xml:space="preserve">
|
||||
<value>開始</value>
|
||||
</data>
|
||||
<data name="StatsDashboardControlThisMonth.Content" xml:space="preserve">
|
||||
<value>本月</value>
|
||||
</data>
|
||||
<data name="StatsDashboardControlThisQuarter.Header" xml:space="preserve">
|
||||
<data name="StatsDashboardControlThisQuarter.Content" xml:space="preserve">
|
||||
<value>本季</value>
|
||||
</data>
|
||||
<data name="StatsDashboardControlThisWeek.Header" xml:space="preserve">
|
||||
<data name="StatsDashboardControlThisWeek.Content" xml:space="preserve">
|
||||
<value>本週</value>
|
||||
</data>
|
||||
<data name="StatsDashboardControlThisYear.Header" xml:space="preserve">
|
||||
<value>今年</value>
|
||||
<data name="StatsDashboardControlThisYear.Content" xml:space="preserve">
|
||||
<value>本年</value>
|
||||
</data>
|
||||
<data name="StatsDashboardControlToday.Header" xml:space="preserve">
|
||||
<value>今天</value>
|
||||
<data name="StatsDashboardControlTimeRange.Header" xml:space="preserve">
|
||||
<value>時間範圍</value>
|
||||
</data>
|
||||
<data name="StatsDashboardControlTimes" xml:space="preserve">
|
||||
<value>次</value>
|
||||
</data>
|
||||
<data name="StatsDashboardControlToday.Content" xml:space="preserve">
|
||||
<value>今日</value>
|
||||
</data>
|
||||
<data name="StatsDashboardControlTopArtists.Text" xml:space="preserve">
|
||||
<value>頂級藝術家</value>
|
||||
<value>常聽的藝術家</value>
|
||||
</data>
|
||||
<data name="StatsDashboardControlTopSongs.Text" xml:space="preserve">
|
||||
<value>熱門曲目</value>
|
||||
<value>常聽的曲目</value>
|
||||
</data>
|
||||
<data name="StatsDashboardControlTopSource.Text" xml:space="preserve">
|
||||
<value>頂端來源</value>
|
||||
<value>常用的播放來源</value>
|
||||
</data>
|
||||
<data name="StatsDashboardControlTotalDuration.Text" xml:space="preserve">
|
||||
<value>總時間</value>
|
||||
</data>
|
||||
<data name="StatsDashboardControlTrackCountAxis.AxisName" xml:space="preserve">
|
||||
<value>次</value>
|
||||
</data>
|
||||
<data name="StatsDashboardControlTrackCountText.Text" xml:space="preserve">
|
||||
<value>次</value>
|
||||
</data>
|
||||
<data name="StatsDashboardControlTracksPlayed.Text" xml:space="preserve">
|
||||
<value>播放曲目</value>
|
||||
</data>
|
||||
|
||||
@@ -235,5 +235,11 @@ namespace BetterLyrics.WinUI3.ViewModels
|
||||
await dialog.ShowAsync();
|
||||
}
|
||||
|
||||
[RelayCommand]
|
||||
private void OpenMusicGalleryWindow()
|
||||
{
|
||||
WindowHook.OpenOrShowWindow<MusicGalleryWindow>();
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
@@ -3,6 +3,7 @@ using BetterLyrics.WinUI3.Constants;
|
||||
using BetterLyrics.WinUI3.Enums;
|
||||
using BetterLyrics.WinUI3.Extensions;
|
||||
using BetterLyrics.WinUI3.Helper;
|
||||
using BetterLyrics.WinUI3.Hooks;
|
||||
using BetterLyrics.WinUI3.Models;
|
||||
using BetterLyrics.WinUI3.Models.Settings;
|
||||
using BetterLyrics.WinUI3.Services.FileSystemService;
|
||||
@@ -10,6 +11,7 @@ using BetterLyrics.WinUI3.Services.LocalizationService;
|
||||
using BetterLyrics.WinUI3.Services.SettingsService;
|
||||
using BetterLyrics.WinUI3.Views;
|
||||
using CommunityToolkit.Mvvm.ComponentModel;
|
||||
using CommunityToolkit.Mvvm.DependencyInjection;
|
||||
using CommunityToolkit.Mvvm.Input;
|
||||
using CommunityToolkit.Mvvm.Messaging;
|
||||
using CommunityToolkit.Mvvm.Messaging.Messages;
|
||||
@@ -642,6 +644,14 @@ namespace BetterLyrics.WinUI3.ViewModels
|
||||
await PlayTrackAtAsync(-1);
|
||||
}
|
||||
|
||||
[RelayCommand]
|
||||
private void OpenMediaSettings()
|
||||
{
|
||||
WindowHook.OpenOrShowWindow<SettingsWindow>();
|
||||
var settingsPageViewModel = Ioc.Default.GetRequiredService<SettingsPageViewModel>();
|
||||
settingsPageViewModel.NavViewSelectedItemTag = "MediaLib";
|
||||
}
|
||||
|
||||
public void Receive(PropertyChangedMessage<DateTime?> message)
|
||||
{
|
||||
if (message.Sender is MediaFolder)
|
||||
|
||||
@@ -2,50 +2,201 @@
|
||||
using BetterLyrics.WinUI3.Helper;
|
||||
using BetterLyrics.WinUI3.Models;
|
||||
using BetterLyrics.WinUI3.Models.Stats;
|
||||
using BetterLyrics.WinUI3.Services.AlbumArtSearchService;
|
||||
using BetterLyrics.WinUI3.Services.LocalizationService;
|
||||
using BetterLyrics.WinUI3.Services.PlayHistoryService;
|
||||
using CommunityToolkit.Mvvm.ComponentModel;
|
||||
using CommunityToolkit.Mvvm.Input;
|
||||
using LiveChartsCore;
|
||||
using LiveChartsCore.Kernel;
|
||||
using LiveChartsCore.Kernel.Sketches;
|
||||
using LiveChartsCore.SkiaSharpView;
|
||||
using LiveChartsCore.SkiaSharpView.Painting;
|
||||
using LiveChartsCore.Themes;
|
||||
using Microsoft.UI.Xaml;
|
||||
using SkiaSharp;
|
||||
using SkiaSharp.Views.Windows;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Collections.ObjectModel;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
using System.Xml.Linq;
|
||||
|
||||
namespace BetterLyrics.WinUI3.ViewModels
|
||||
{
|
||||
public partial class StatsDashboardControlViewModel : ObservableObject
|
||||
{
|
||||
private readonly IPlayHistoryService _playHistoryService;
|
||||
private readonly ILocalizationService _localizationService;
|
||||
private readonly IAlbumArtSearchService _albumArtSearchService;
|
||||
|
||||
public StatsDashboardControlViewModel(IPlayHistoryService playHistoryService)
|
||||
{
|
||||
_playHistoryService = playHistoryService;
|
||||
}
|
||||
private string _localizedTimesValue;
|
||||
|
||||
[ObservableProperty] public partial bool IsLoading { get; set; }
|
||||
|
||||
// 时间筛选
|
||||
[ObservableProperty] public partial StatsRange SelectedTimeRange { get; set; }
|
||||
[ObservableProperty] public partial bool IsCustomRangeSelected { get; set; }
|
||||
[ObservableProperty] public partial DateTimeOffset CustomStartDate { get; set; }
|
||||
[ObservableProperty] public partial DateTimeOffset CustomEndDate { get; set; } = DateTimeOffset.Now;
|
||||
|
||||
// 顶部基础数据
|
||||
[ObservableProperty] public partial TimeSpan TotalDuration { get; set; }
|
||||
[ObservableProperty] public partial int TotalTracksPlayed { get; set; }
|
||||
[ObservableProperty] public partial string TopPlayerName { get; set; } = "N/A";
|
||||
|
||||
public ObservableCollection<SongPlayCount> TopSongs { get; } = new();
|
||||
public ObservableCollection<ArtistPlayCount> TopArtists { get; } = new();
|
||||
// 时段分布
|
||||
[ObservableProperty] public partial ObservableCollection<int> HourlySeriesValues { get; set; } = new();
|
||||
[ObservableProperty] public partial ObservableCollection<string> HourlyXAxisLabels { get; set; } = [.. Enumerable.Range(0, 24).Select(x => $"{x:D2}:00")];
|
||||
[ObservableProperty] public partial string PeakHourText { get; set; } = "--:--";
|
||||
[ObservableProperty] public partial string QuietHourText { get; set; } = "--:--";
|
||||
|
||||
public ObservableCollection<PlayerStatDisplayItem> PlayerStats { get; } = new();
|
||||
// 歌手
|
||||
[ObservableProperty] public partial ObservableCollection<ArtistPlayCount> TopArtists { get; set; } = new();
|
||||
[ObservableProperty] public partial ObservableCollection<int> ArtistSeriesValues { get; set; } = new();
|
||||
public Func<ChartPoint, string> ArtistsLabelsFormatter { get; set; }
|
||||
|
||||
// 播放源
|
||||
[ObservableProperty] public partial ObservableCollection<ISeries> SourceSeries { get; set; } = new();
|
||||
|
||||
// 歌曲
|
||||
[ObservableProperty] public partial ObservableCollection<SongPlayCount> TopSongs { get; set; } = new();
|
||||
|
||||
public StatsDashboardControlViewModel(IPlayHistoryService playHistoryService, ILocalizationService localizationService, IAlbumArtSearchService albumArtSearchService)
|
||||
{
|
||||
_playHistoryService = playHistoryService;
|
||||
_localizationService = localizationService;
|
||||
_albumArtSearchService = albumArtSearchService;
|
||||
|
||||
_localizedTimesValue = _localizationService.GetLocalizedString("StatsDashboardControlTimes");
|
||||
|
||||
ArtistsLabelsFormatter = (point) =>
|
||||
{
|
||||
return TopArtists.ElementAtOrDefault(point.Index)?.Artist ?? "N/A";
|
||||
};
|
||||
|
||||
SelectedTimeRange = StatsRange.Today;
|
||||
|
||||
CustomStartDate = DateTimeOffset.Now.AddDays(-7);
|
||||
CustomEndDate = DateTimeOffset.Now;
|
||||
}
|
||||
|
||||
async partial void OnSelectedTimeRangeChanged(StatsRange value)
|
||||
{
|
||||
IsCustomRangeSelected = value == StatsRange.Custom;
|
||||
if (!IsCustomRangeSelected)
|
||||
{
|
||||
await LoadDataAsync();
|
||||
}
|
||||
}
|
||||
async partial void OnCustomEndDateChanged(DateTimeOffset value) => await LoadDataAsync();
|
||||
async partial void OnCustomStartDateChanged(DateTimeOffset value) => await LoadDataAsync();
|
||||
|
||||
private void ProcessHourlyStats(List<PlayHistoryItem> logs)
|
||||
{
|
||||
if (logs == null || !logs.Any())
|
||||
{
|
||||
PeakHourText = "--:--";
|
||||
QuietHourText = "--:--";
|
||||
HourlySeriesValues = new();
|
||||
return;
|
||||
}
|
||||
|
||||
var hourCounts = new int[24];
|
||||
foreach (var log in logs)
|
||||
{
|
||||
hourCounts[log.StartedAt.ToLocalTime().Hour]++;
|
||||
}
|
||||
|
||||
int peakHour = Array.IndexOf(hourCounts, hourCounts.Max());
|
||||
PeakHourText = $"{peakHour:D2}:00 - {peakHour + 1:D2}:00";
|
||||
|
||||
int quietHour = Array.IndexOf(hourCounts, hourCounts.Min());
|
||||
QuietHourText = $"{quietHour:D2}:00 - {quietHour + 1:D2}:00";
|
||||
|
||||
HourlySeriesValues = [.. hourCounts];
|
||||
}
|
||||
private void ProcessArtistStats(List<ArtistPlayCount> artists)
|
||||
{
|
||||
if (artists == null || !artists.Any())
|
||||
{
|
||||
ArtistSeriesValues = new();
|
||||
return;
|
||||
}
|
||||
|
||||
ArtistSeriesValues = [.. artists.Select(x => x.PlayCount)];
|
||||
}
|
||||
private void UpdatePlayerStats(List<PlayerStats> stats)
|
||||
{
|
||||
SourceSeries = new();
|
||||
|
||||
if (stats == null || stats.Count == 0)
|
||||
{
|
||||
TopPlayerName = "N/A";
|
||||
return;
|
||||
}
|
||||
|
||||
var topPlayer = stats.OrderByDescending(x => x.Count).FirstOrDefault();
|
||||
TopPlayerName = PlayerIdHelper.GetDisplayName(topPlayer?.PlayerId) ?? "N/A";
|
||||
|
||||
var colors = PaletteHelper.GenerateChartColors(ColorHelper.GetSystemAccentColor(), stats.Count);
|
||||
|
||||
SourceSeries = [.. stats.OrderByDescending(x => x.Count).Select((x, i) => new PieSeries<int>
|
||||
{
|
||||
Values = [x.Count],
|
||||
Name = PlayerIdHelper.GetDisplayName(x.PlayerId),
|
||||
ToolTipLabelFormatter = point => $"{x.Count} {_localizedTimesValue}",
|
||||
|
||||
Pushout = 4, // 间隙
|
||||
})];
|
||||
}
|
||||
|
||||
private (DateTime Start, DateTime End) CalculateDateRange()
|
||||
{
|
||||
// 如果是自定义,直接返回 Picker 的值 (转为 UTC)
|
||||
if (IsCustomRangeSelected)
|
||||
{
|
||||
return (CustomStartDate.UtcDateTime, CustomEndDate.UtcDateTime);
|
||||
}
|
||||
|
||||
DateTime nowLocal = DateTime.Now;
|
||||
DateTime startLocal = nowLocal.Date;
|
||||
|
||||
switch (SelectedTimeRange)
|
||||
{
|
||||
case StatsRange.Today:
|
||||
startLocal = nowLocal.Date.AddDays(-1);
|
||||
return (startLocal.ToUniversalTime(), nowLocal.Date.ToUniversalTime());
|
||||
case StatsRange.ThisWeek:
|
||||
int dayOfWeek = (int)nowLocal.DayOfWeek;
|
||||
if (dayOfWeek == 0) dayOfWeek = 7;
|
||||
startLocal = nowLocal.Date.AddDays(-(dayOfWeek - 1));
|
||||
break;
|
||||
case StatsRange.ThisMonth:
|
||||
startLocal = new DateTime(nowLocal.Year, nowLocal.Month, 1);
|
||||
break;
|
||||
case StatsRange.ThisQuarter:
|
||||
int quarterStartMonth = (nowLocal.Month - 1) / 3 * 3 + 1;
|
||||
startLocal = new DateTime(nowLocal.Year, quarterStartMonth, 1);
|
||||
break;
|
||||
case StatsRange.ThisYear:
|
||||
startLocal = new DateTime(nowLocal.Year, 1, 1);
|
||||
break;
|
||||
}
|
||||
|
||||
return (startLocal.ToUniversalTime(), nowLocal.ToUniversalTime());
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 核心方法:根据选中的 Tab 加载数据
|
||||
/// </summary>
|
||||
[RelayCommand]
|
||||
public async Task LoadDataAsync(StatsRange range)
|
||||
public async Task LoadDataAsync()
|
||||
{
|
||||
if (IsLoading) return;
|
||||
IsLoading = true;
|
||||
|
||||
try
|
||||
{
|
||||
var (start, end) = CalculateDateRange(range);
|
||||
var (start, end) = CalculateDateRange();
|
||||
|
||||
var durationTask = _playHistoryService.GetTotalListeningDurationAsync(start, end);
|
||||
var logsTask = _playHistoryService.GetLogsByDateRangeAsync(start, end);
|
||||
@@ -59,13 +210,15 @@ namespace BetterLyrics.WinUI3.ViewModels
|
||||
var logs = await logsTask;
|
||||
TotalTracksPlayed = logs.Count;
|
||||
|
||||
TopSongs.Clear();
|
||||
foreach (var item in await topSongsTask) TopSongs.Add(item);
|
||||
TopSongs = [.. await topSongsTask];
|
||||
|
||||
TopArtists.Clear();
|
||||
foreach (var item in await topArtistsTask) TopArtists.Add(item);
|
||||
var pStats = await playersTask;
|
||||
UpdatePlayerStats(pStats);
|
||||
|
||||
UpdatePlayerStats(await playersTask);
|
||||
TopArtists = [.. await topArtistsTask];
|
||||
ProcessArtistStats(TopArtists.ToList());
|
||||
|
||||
ProcessHourlyStats(logs);
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
@@ -80,69 +233,9 @@ namespace BetterLyrics.WinUI3.ViewModels
|
||||
[RelayCommand]
|
||||
private async Task GenerateTestDataAsync()
|
||||
{
|
||||
await _playHistoryService.GenerateTestDataAsync(10000);
|
||||
await _playHistoryService.GenerateTestDataAsync(1000);
|
||||
await LoadDataAsync(); // 生成完刷新
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 将原始统计数据转换为带进度条宽度的 UI 数据
|
||||
/// </summary>
|
||||
private void UpdatePlayerStats(List<PlayerStats> stats)
|
||||
{
|
||||
PlayerStats.Clear();
|
||||
|
||||
if (stats == null || stats.Count == 0)
|
||||
{
|
||||
TopPlayerName = "N/A";
|
||||
return;
|
||||
}
|
||||
|
||||
double maxCount = stats.Max(x => x.Count);
|
||||
if (maxCount == 0) maxCount = 1;
|
||||
|
||||
var topPlayer = stats.OrderByDescending(x => x.Count).FirstOrDefault();
|
||||
TopPlayerName = PlayerIdHelper.GetDisplayName(topPlayer?.PlayerId) ?? "N/A";
|
||||
|
||||
foreach (var item in stats.OrderByDescending(x => x.Count))
|
||||
{
|
||||
PlayerStats.Add(new PlayerStatDisplayItem
|
||||
{
|
||||
PlayerId = item.PlayerId,
|
||||
PlayCount = item.Count,
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
private (DateTime Start, DateTime End) CalculateDateRange(StatsRange range)
|
||||
{
|
||||
DateTime nowLocal = DateTime.Now;
|
||||
DateTime startLocal = nowLocal.Date; // 默认为本地今天 00:00
|
||||
|
||||
switch (range)
|
||||
{
|
||||
case StatsRange.Day:
|
||||
break;
|
||||
case StatsRange.Week:
|
||||
int dayOfWeek = (int)nowLocal.DayOfWeek;
|
||||
if (dayOfWeek == 0) dayOfWeek = 7; // 处理周日
|
||||
startLocal = nowLocal.Date.AddDays(-(dayOfWeek - 1));
|
||||
break;
|
||||
case StatsRange.Month:
|
||||
startLocal = new DateTime(nowLocal.Year, nowLocal.Month, 1);
|
||||
break;
|
||||
case StatsRange.Quarter:
|
||||
int quarterStartMonth = (nowLocal.Month - 1) / 3 * 3 + 1;
|
||||
startLocal = new DateTime(nowLocal.Year, quarterStartMonth, 1);
|
||||
break;
|
||||
case StatsRange.Year:
|
||||
startLocal = new DateTime(nowLocal.Year, 1, 1);
|
||||
break;
|
||||
}
|
||||
|
||||
// 数据库里的 StartedAt 是 UTC,所以查询条件必须也是 UTC
|
||||
DateTime startUtc = startLocal.ToUniversalTime();
|
||||
DateTime endUtc = nowLocal.ToUniversalTime();
|
||||
|
||||
return (startUtc, endUtc);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -161,11 +161,16 @@
|
||||
|
||||
<NavigationViewItemSeparator Grid.Row="2" />
|
||||
|
||||
<StackPanel
|
||||
Grid.Row="3"
|
||||
Orientation="Horizontal"
|
||||
Spacing="3">
|
||||
<TextBlock
|
||||
x:Uid="MusicGalleryPageFolder"
|
||||
Grid.Row="3"
|
||||
Margin="1,4,0,6"
|
||||
Style="{StaticResource SettingsSectionHeaderTextBlockStyle}" />
|
||||
<Button Command="{x:Bind ViewModel.OpenMediaSettingsCommand}" Content="{ui:FontIcon FontFamily={StaticResource IconFontFamily}, FontSize=12, Glyph=}" Style="{StaticResource GhostButtonStyle}" />
|
||||
</StackPanel>
|
||||
|
||||
<TreeView
|
||||
x:Name="FolderTreeView"
|
||||
|
||||
BIN
Promotion/banner_fade.png
Normal file
|
After Width: | Height: | Size: 239 KiB |
302
README.CN.md
@@ -1,239 +1,185 @@
|
||||

|
||||
[**中文**](README.CN.md) | [**English**](README.md)
|
||||
|
||||
<div align="center">
|
||||
<img src="BetterLyrics.WinUI3/BetterLyrics.WinUI3/Assets/Logo.png" alt="Logo" width="120">
|
||||
|
||||
<h1>BetterLyrics</h1>
|
||||
|
||||
<h4>
|
||||
🤩 一款优雅且高度自定义的歌词可视化与全能音乐播放应用 <br>
|
||||
基于 WinUI3 / Win2D 构建
|
||||
</h4>
|
||||
|
||||
<div>
|
||||
<img src="https://img.shields.io/badge/Language-C%23-purple" alt="C#">
|
||||
<img src="https://img.shields.io/badge/Framework-WinUI%203-blue" alt="WinUI 3">
|
||||
<img src="https://img.shields.io/badge/License-GPL_v3.0-blue" alt="License">
|
||||
<a href="https://github.com/jayfunc/BetterLyrics/stargazers"><img src="https://img.shields.io/github/stars/jayfunc/BetterLyrics" alt="Stars"></a>
|
||||
<a href="https://crowdin.com/project/betterlyrics"><img src="https://badges.crowdin.net/betterlyrics/localized.svg" alt="Crowdin"></a>
|
||||
</div>
|
||||
|
||||
<br>
|
||||
|
||||
<img src="Promotion/banner.png" alt="Banner" width="100%" style="border-radius: 10px;">
|
||||
|
||||
<div align=center>
|
||||
<img src="BetterLyrics.WinUI3/BetterLyrics.WinUI3/Assets/Logo.png" alt="" width="96">
|
||||
</div>
|
||||
|
||||
<h2 align=center>
|
||||
BetterLyrics
|
||||
</h2>
|
||||
<br>
|
||||
|
||||
<h4 align="center">
|
||||
🤩 一款优雅且高度自定义的歌词/播放器应用,基于 WinUI3/Win2D 构建
|
||||
</h4>
|
||||
## 🔥 精选推荐与社区
|
||||
|
||||
<div align="center">
|
||||
|
||||
[使用指南](https://github.com/jayfunc/BetterLyrics/wiki/使用指南) | [隐私政策](PrivacyPolicy.CN.md) | [服务协议](TermsofService.CN.md)
|
||||
| HelloGitHub 推荐 | 少数派 SSPAI 推荐 | 🤖 AI 问答 |
|
||||
| :---: | :---: | :---: |
|
||||
| <a href="https://hellogithub.com/repository/jayfunc/BetterLyrics" target="_blank"><img src="https://abroad.hellogithub.com/v1/widgets/recommend.svg?rid=d2af74f0aea146ad8e4b2086982f5777&claim_uid=SgtQs9c54C8wjnv" alt="HelloGitHub" height="40"></a> | [**阅读评测文章**](https://sspai.com/post/101028) | [](https://deepwiki.com/jayfunc/BetterLyrics) <br> [](https://zread.ai/jayfunc/BetterLyrics) |
|
||||
|
||||
**交流群:** [QQ 群 (1054700388)](https://qun.qq.com/universal-share/share?ac=1&authKey=4Q%2BYTq3wZldYpF5SbS5c19ECFsiYoLZFAIcBNNzYpBUtiEjaZ8sZ%2F%2BnFN0qw3lad&busi_data=eyJncm91cENvZGUiOiIxMDU0NzAwMzg4IiwidG9rZW4iOiJiVnhqemVYN0N5QVc3b1ZkR24wWmZOTUtvUkJoWm1JRWlaWW5iZnlBcXJtZUtGc2FFTHNlUlFZMi9iRm03cWF5IiwidWluIjoiMTM5NTczOTY2MCJ9&data=39UmAihyH_o6CZaOs7nk2mO_lz2ruODoDou6pxxh7utcxP4WF5sbDBDOPvZ_Wqfzeey4441anegsLYQJxkrBAA&svctype=4&tempid=h5_group_info) | [Discord](https://discord.gg/5yAQPnyCKv) | [Telegram](https://t.me/+svhSLZ7awPsxNGY1)
|
||||
|
||||
</div>
|
||||
|
||||
<div align=center>
|
||||
|
||||

|
||||

|
||||

|
||||

|
||||
|
||||
</div>
|
||||
|
||||
<div align=center>
|
||||
|
||||
[](https://github.com/jayfunc/BetterLyrics/stargazers)
|
||||
[](https://crowdin.com/project/betterlyrics)
|
||||
|
||||
</div>
|
||||
|
||||
<div align=center>
|
||||
|
||||
[](https://deepwiki.com/jayfunc/BetterLyrics)
|
||||
[](https://zread.ai/jayfunc/BetterLyrics)
|
||||
|
||||
</div>
|
||||
## 🧪 下载与安装
|
||||
|
||||
<div align="center">
|
||||
|
||||
<mark>**_💞 BetterLyrics 的发展离不开每一位贡献者、反馈者和用户的全力支持。_**</mark>
|
||||
| Microsoft Store (推荐) | 手动安装 |
|
||||
| :---: | :---: |
|
||||
| <a href="https://apps.microsoft.com/detail/9P1WCD1P597R?referrer=appbadge&mode=direct"><img src="https://get.microsoft.com/images/en-us%20dark.svg" width="160"/></a><br>无限期免费试用(功能与付费版一致) | [**📦 最新版本 (.zip)**](https://github.com/jayfunc/BetterLyrics/releases/latest)<br>[查看安装指南](https://www.cnblogs.com/jayfunc/p/19212078) |
|
||||
|
||||
<mark>**_项目持续活跃开发中,可能会遇到未知问题。_**</mark>
|
||||
[📖 用户指南](https://github.com/jayfunc/BetterLyrics/wiki/使用指南) | [🔒 隐私政策](PrivacyPolicy.CN.md) | [⚖️ 服务条款](TermsofService.CN.md)
|
||||
|
||||
</div>
|
||||
|
||||
## ✍️ 协助翻译
|
||||
## 🌟 核心功能
|
||||
|
||||
找不到你的语言?有更好的翻译?没关系!😆 访问 [此处](https://github.com/jayfunc/BetterLyrics?tab=contributing-ov-file) 查看如何贡献翻译!
|
||||
- 🎨 **绝美视觉与 UI**
|
||||
- **优雅设计:** 基于 WinUI3 & Win2D 的流畅、高度个性化风格。
|
||||
- **沉浸特效:** 支持流体背景、3D/扇形歌词、雪花粒子等多种效果。
|
||||
- **深度定制:** 按需配置动画、字体和行为逻辑,打造你的专属播放器。
|
||||
|
||||
## 🎉 该项目已被 HelloGithub 推荐!
|
||||
- 🎧 **多功能播放与连接**
|
||||
- **内置播放器:** 支持播放 **本地硬盘** 文件或通过 **网络协议** (SMB, WebDAV) 流式播放。
|
||||
- **外部集成:** 可视化来自 Spotify, Apple Music, 网易云音乐及 [其他多种播放器](https://github.com/jayfunc/BetterLyrics/wiki/使用指南#已知支持的音乐播放器配置指南) 的音乐。
|
||||
|
||||
<a href="https://hellogithub.com/repository/jayfunc/BetterLyrics" target="_blank"><img src="https://abroad.hellogithub.com/v1/widgets/recommend.svg?rid=d2af74f0aea146ad8e4b2086982f5777&claim_uid=SgtQs9c54C8wjnv" alt="Featured|HelloGitHub" style="width: 250px; height: 54px;" width="250" height="54" /></a>
|
||||
- 🌐 **强大的歌词系统**
|
||||
- **离线翻译:** 注重隐私的本地机器翻译(支持 30+ 种语言)。
|
||||
- **全面源支持:** 支持 .lrc (标准/增强), .eslrc, .ttml, 内嵌标签,以及在线源(QQ 音乐, 网易云, LRCLIB)。
|
||||
- **Apple Music:** 支持歌词获取(需配置 Token)。
|
||||
|
||||
## 🎉 该项目入选少数派推荐文章!
|
||||
- 🪟 **全场景显示模式**
|
||||
- **标准模式:** 全屏沉浸式体验。
|
||||
- **停靠模式:** 贴附于屏幕边缘的精致侧边栏。
|
||||
- **桌面悬浮:** 悬浮于所有应用之上的歌词挂件。
|
||||
|
||||
文章链接:[BetterLyrics - 一款专为 Windows 打造的沉浸式流畅歌词显示软件](https://sspai.com/post/101028)。
|
||||
- 🧠 **智能行为**
|
||||
- 音乐暂停时自动隐藏。
|
||||
|
||||
## 🔈 反馈交流群
|
||||
## 🖼️ 软件截图
|
||||
|
||||
[QQ 群](https://qun.qq.com/universal-share/share?ac=1&authKey=4Q%2BYTq3wZldYpF5SbS5c19ECFsiYoLZFAIcBNNzYpBUtiEjaZ8sZ%2F%2BnFN0qw3lad&busi_data=eyJncm91cENvZGUiOiIxMDU0NzAwMzg4IiwidG9rZW4iOiJiVnhqemVYN0N5QVc3b1ZkR24wWmZOTUtvUkJoWm1JRWlaWW5iZnlBcXJtZUtGc2FFTHNlUlFZMi9iRm03cWF5IiwidWluIjoiMTM5NTczOTY2MCJ9&data=39UmAihyH_o6CZaOs7nk2mO_lz2ruODoDou6pxxh7utcxP4WF5sbDBDOPvZ_Wqfzeey4441anegsLYQJxkrBAA&svctype=4&tempid=h5_group_info) (1054700388) | [Discord Server](https://discord.gg/5yAQPnyCKv) | [Telegram Group](https://t.me/+svhSLZ7awPsxNGY1)
|
||||
<div align="center">
|
||||
|
||||
## 🌟 特色功能
|
||||
| 标准视图 | 侧边栏模式 |
|
||||
| :---: | :---: |
|
||||
| <img src="Screenshots/std.png" width="100%"> | <img src="Screenshots/narrow.png" width="100%"> |
|
||||
|
||||
- 🌠 **精美的用户界面**
|
||||
- 流畅、高度自定义的样式、动画、动效
|
||||
- 沉浸式流体背景
|
||||
- 透视/扇形歌词
|
||||
- 雪花效果
|
||||
- 多种歌词滚动函数
|
||||
- ...
|
||||
- ↔️ **强大的歌词翻译**
|
||||
- 本地机器翻译 (支持 30 多种语言)
|
||||
- 自动读取本地音乐文件内嵌歌词
|
||||
- 🧩 **多种歌词源**
|
||||
- 💾 本地源
|
||||
- 音乐文件 (内嵌歌词)
|
||||
- [.lrc](<https://en.wikipedia.org/wiki/LRC_(file_format)>) 文件 (传统格式、增强格式)
|
||||
- [.eslrc](https://github.com/ESLyric/release) 文件
|
||||
- [.ttml](https://en.wikipedia.org/wiki/Timed_Text_Markup_Language) 文件
|
||||
- ☁️ 在线源
|
||||
- QQ 音乐
|
||||
- 网易云音乐
|
||||
- 酷狗音乐
|
||||
- [amll-ttml-db](https://github.com/Steve-xmh/amll-ttml-db)
|
||||
- [LRCLIB](https://lrclib.net/)
|
||||
- <details><summary>⚠️ Apple Music (需要额外配置)</summary>
|
||||
| 歌词视觉特效 | 多模式共存 |
|
||||
| :---: | :---: |
|
||||
| <img src="Screenshots/effect.png" width="100%"> | <img src="Screenshots/all-in-one.png" width="100%"> |
|
||||
|
||||
- 浏览器打开 Apple Music,打开开发者工具。刷新网页,回到开发者工具窗口,筛选出 Fetch/XHR,选择一个请求,在请求标头中找到 media-user-token 并复制其值。
|
||||
- 打开 BetterLyrics 转到播放源设置。在 Media-User-Token (for Apple Music) 中粘贴复制的值并点按右侧对勾。
|
||||
| 全屏模式 | 全屏模式 |
|
||||
| :---: | :---: |
|
||||
| <img src="Screenshots/fs3.png" width="100%"> | <img src="Screenshots/fs2.png" width="100%"> |
|
||||
|
||||
- 🎶 **支持众多音乐播放器**
|
||||
| 音乐库 | 播放统计 |
|
||||
| :---: | :---: |
|
||||
| <img src="Screenshots/music-gallery.png" width="100%"> | <img src="Screenshots/stats.png" width="100%"> |
|
||||
|
||||
- 点击 [此处](https://github.com/jayfunc/BetterLyrics/wiki/使用指南#已知支持的音乐播放器配置指南) 查看详细信息
|
||||
</div>
|
||||
|
||||
- 🪟 **多种显示模式**
|
||||
- **标准模式**
|
||||
- 标准的歌词窗口样式,沉浸式的音乐歌词体验。
|
||||
- **停靠模式**
|
||||
- 停靠在屏幕上/下边缘的轻量歌词窗口,工作休闲互不打扰。
|
||||
- **桌面模式**
|
||||
- 悬浮在所有应用上层,不能被选中,但能直击你的使用需求。
|
||||
- **更多模式...**
|
||||
- 等你来发现...
|
||||
- 🧠 **智能化行为**
|
||||
- 根据歌曲播放状态自动显隐歌词窗口
|
||||
## 📹 演示视频
|
||||
|
||||
## 🖼️ 屏幕截图
|
||||
> 观看我们在 Bilibili 发布的演示视频(上传于 2025 年 10 月 21 日):[点击观看](https://www.bilibili.com/video/BV1QRstz1EGt/)。
|
||||
|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||
## ✍️ 贡献与构建
|
||||
|
||||
> ⚠️ 由于 GIF 格式帧率限制,效果仅作展示。请以实机效果为准。
|
||||
**协助翻译:** 找不到你的语言?[点此开始翻译](https://github.com/jayfunc/BetterLyrics?tab=contributing-ov-file)。
|
||||
|
||||

|
||||

|
||||
**从源码构建:**
|
||||
> 构建前,请确保已替换 `Constants` 文件夹下的 `DiscordTemplate.cs` 和 `LastFM.cs`。
|
||||
|
||||
## 📹 演示
|
||||
## 🤑 赞助与捐赠
|
||||
|
||||
在 [哔哩哔哩](https://www.bilibili.com/video/BV1QRstz1EGt/) 上观看于 2025 年 10 月 21 日上传的演示视频。
|
||||
如果你喜欢 BetterLyrics,请考虑支持它。你的支持有助于项目持续发展!
|
||||
|
||||
## 🧪 即刻体验
|
||||
<div align="center">
|
||||
|
||||
<a href="https://apps.microsoft.com/detail/9P1WCD1P597R?referrer=appbadge&mode=direct">
|
||||
<img src="https://get.microsoft.com/images/zh-cn%20dark.svg" width="200"/>
|
||||
</a>
|
||||
| 网页平台 | 支付宝 (扫码) | 微信 (扫码) |
|
||||
| :---: | :---: | :---: |
|
||||
| [PayPal](https://paypal.me/zhefangpay)<br><br>[Buy Me a Coffee](https://buymeacoffee.com/founchoo)<br><br>[爱发电 (Afdian)](https://afdian.com/a/jayfunc) | <img src="Donate/Alipay.jpg" width="150"> | <img src="Donate/WeChatReward.png" width="150"> |
|
||||
|
||||
**无限期**免费试用版和付费版**无任何区别**。
|
||||
**[查看完整赞助者名单 (Hall of Fame)](SPONSORS.md)**
|
||||
|
||||
如果喜欢该软件,请考虑 [捐赠](#-捐赠) 或在 **Microsoft Store** 购买,感谢您的支持! 🥰
|
||||
</div>
|
||||
|
||||
无法从 Microsoft Store 下载?尝试以下方法:
|
||||
- [从 Microsoft Store 外部下载](https://www.cnblogs.com/jayfunc/p/19212083)
|
||||
- 转至 [最新发布页](https://github.com/jayfunc/BetterLyrics/releases/latest) 并从 `Assets`(资产)列表下载 `.zip` 文件。(安装方法参考 [此文档](https://www.cnblogs.com/jayfunc/p/19212078)。)
|
||||
## ⭐ Star 历史趋势
|
||||
|
||||
## 🏗️ 构建
|
||||
<div align="center">
|
||||
<img src="https://api.star-history.com/svg?repos=jayfunc/BetterLyrics&type=Date" width="100%">
|
||||
</div>
|
||||
|
||||
在构建之前确保:
|
||||
- 替换文件 `BetterLyrics\BetterLyrics.WinUI3\BetterLyrics.WinUI3\Constants\DiscordTemplate` 为 `BetterLyrics\BetterLyrics.WinUI3\BetterLyrics.WinUI3\Constants\DiscordTemplate.cs`.
|
||||
- 替换文件 `BetterLyrics\BetterLyrics.WinUI3\BetterLyrics.WinUI3\Constants\LastFMTemplate` 为 `BetterLyrics\BetterLyrics.WinUI3\BetterLyrics.WinUI3\Constants\LastFM.cs`。
|
||||
## 📄 许可与致谢
|
||||
|
||||
## 🤑 捐赠
|
||||
本项目采用 **GNU General Public License v3.0** 许可证。
|
||||
|
||||
如果你喜欢本应用,请考虑捐赠支持开发者。这将有助于本应用的长远发展。
|
||||
<details>
|
||||
<summary><b>💖 特别致谢、引用与灵感</b></summary>
|
||||
<br>
|
||||
|
||||
通过以下途径捐赠:
|
||||
- [PayPal](https://paypal.me/zhefangpay)
|
||||
- [Buy Me a Coffee](https://buymeacoffee.com/founchoo)
|
||||
- [爱发电](https://afdian.com/a/jayfunc)
|
||||
- <details><summary>支付宝</summary>
|
||||
**依赖与引用:**
|
||||
|
||||

|
||||
|
||||
</detais>
|
||||
|
||||
- <details><summary>微信</summary>
|
||||
|
||||

|
||||
|
||||
</details>
|
||||
|
||||
本项目的持续发展离不开大家的支持。**[查看完整鸣谢名单](SPONSORS.md)**
|
||||
|
||||
## 📄 许可证
|
||||
|
||||
本项目采用 GNU 通用公共许可证 v3.0 授权。详情请参阅 [LICENSE](https://github.com/jayfunc/BetterLyrics/blob/dev/LICENSE) 文件。
|
||||
|
||||
## 💖 感谢
|
||||
|
||||
部分功能及代码引用或修改自公开资料库,包括但不限于下述开源项目/包、教程等,在此一并感谢。
|
||||
|
||||
| 项目/包 | 描述 |
|
||||
| 项目/包 (Projects/Packages) | 描述 (Description) |
|
||||
| :--- | :--- |
|
||||
| [Lyricify-Lyrics-Helper](https://github.com/WXRIW/Lyricify-Lyrics-Helper) | 为 QQ、网易、酷狗在线歌词源提供歌词抓取、解密、解析等一系列方法 |
|
||||
| [lrclib](https://github.com/tranxuanthang/lrclib) | LRCLIB 歌词 API |
|
||||
| [Manzana-Apple-Music-Lyrics](https://github.com/dropcreations/Manzana-Apple-Music-Lyrics) | Apple Music 歌词抓取(Python 实现) |
|
||||
| [Audio Tools Library (ATL) for .NET](https://github.com/Zeugma440/atldotnet) | 从音乐文件提取图片 |
|
||||
| [WinUIEx](https://github.com/dotMorten/WinUIEx) | 提供有关窗口的开箱即用的 Win32 API |
|
||||
| [TagLib#](https://github.com/mono/taglib-sharp) | 读取音乐文件内嵌的原始歌词内容 |
|
||||
| [Vanara](https://github.com/dahall/Vanara) | 提供开箱即用的 Win32 API |
|
||||
| [LibreTranslate](https://github.com/LibreTranslate/LibreTranslate) | 离线翻译核心 |
|
||||
| [Isolation](https://github.com/Storyteller-Studios/Isolation) | 动态流体背景 |
|
||||
| [SpectrumVisualization](https://github.com/Johnwikix/SpectrumVisualization) | 频谱图 |
|
||||
| [DevWinUI](https://github.com/ghost1372/DevWinUI) | 为 WinUI3 提供众多开箱即用的功能 |
|
||||
| ... | ... |
|
||||
| [Audio Tools Library (ATL) for .NET](https://github.com/Zeugma440/atldotnet) | 用于从音乐文件中提取图片(封面) |
|
||||
| [cutlet](https://github.com/polm/cutlet) | 提供将日语转换为罗马音 (Romaji) 的功能 |
|
||||
| [DevWinUI](https://github.com/ghost1372/DevWinUI) | 为构建 WinUI 3 应用程序提供许多开箱即用的功能 |
|
||||
| [Isolation](https://github.com/Storyteller-Studios/Isolation) | 动态流体背景的实现 |
|
||||
| [LibreTranslate](https://github.com/LibreTranslate/LibreTranslate) | 提供离线歌词翻译功能 |
|
||||
| [lrclib](https://github.com/tranxuanthang/lrclib) | LRCLIB 歌词 API 数据源 |
|
||||
| [Lyricify-Lyrics-Helper](https://github.com/WXRIW/Lyricify-Lyrics-Helper) | 提供 QQ、网易云音乐和酷狗音乐源的歌词抓取、解密及解析功能 |
|
||||
| [Manzana-Apple-Music-Lyrics](https://github.com/dropcreations/Manzana-Apple-Music-Lyrics) | 使用 Python 获取 Apple Music 歌词 |
|
||||
| [SpectrumVisualization](https://github.com/Johnwikix/SpectrumVisualization) | 音频频谱可视化参考 |
|
||||
| [TagLib#](https://github.com/mono/taglib-sharp) | 用于读取原始歌词内容(元数据) |
|
||||
| [Vanara](https://github.com/dahall/Vanara) | Win32 API 封装库 |
|
||||
| [WinUIEx](https://github.com/dotMorten/WinUIEx) | 提供访问与窗口管理相关的 Win32 API 的便捷方式 |
|
||||
|
||||
点按 [此处](https://github.com/jayfunc/BetterLyrics/network/dependencies) 查看所有依赖。
|
||||
查看 [完整依赖列表](https://github.com/jayfunc/BetterLyrics/network/dependencies)。
|
||||
|
||||
### 教程、博客等
|
||||
<br>
|
||||
|
||||
- [Stackoverflow - How to animate Margin property in WPF](https://stackoverflow.com/a/21542882/11048731)
|
||||
- [Bilibili -【WinUI3】SystemBackdropController:定义云母、亚克力效果](https://www.bilibili.com/video/BV1PY4FevEkS)
|
||||
- [cnblogs - .NET App 与 Windows 系统媒体控制(SMTC)交互](https://www.cnblogs.com/TwilightLemon/p/18279496)
|
||||
- [Win2D 中的游戏循环:CanvasAnimatedControl](https://www.cnblogs.com/walterlv/p/10236395.html)
|
||||
- [r2d2rigo/Win2D-Samples](https://github.com/r2d2rigo/Win2D-Samples/blob/master/IrisBlurWin2D/IrisBlurWin2D/MainPage.xaml.cs)
|
||||
- [CommunityToolkit - 从入门到精通](https://mvvm.coldwind.top/)
|
||||
|
||||
## 💡 灵感来源
|
||||
|
||||
部分设计思路参考自下述插件/软件(不含间接或直接引用、修改的代码,仅作为设计思路指导方向)。
|
||||
**💡 灵感来源:**
|
||||
|
||||
部分设计理念参考了以下插件/软件(仅作为设计思路参考,不涉及代码引用):
|
||||
- [refined-now-playing-netease](https://github.com/solstice23/refined-now-playing-netease)
|
||||
- [Lyricify-App](https://github.com/WXRIW/Lyricify-App)
|
||||
- [椒盐音乐 Salt Player](https://moriafly.com/program/salt-player)
|
||||
- [MyToolBar](https://github.com/TwilightLemon/MyToolBar)
|
||||
|
||||
## ⭐ 星标记录
|
||||
</details>
|
||||
|
||||
<div style="display: flex; justify-content: space-around; align-items: flex-start;">
|
||||
<img src="https://api.star-history.com/svg?repos=jayfunc/BetterLyrics&type=Date)](https://www.star-history.com/#jayfunc/BetterLyrics&Date" width="100%" >
|
||||
## 💭 分享到社交媒体
|
||||
|
||||
<details>
|
||||
<summary><b>点击展开</b></summary>
|
||||
<br>
|
||||
<div align="center">
|
||||
<img src="https://socialify.git.ci/jayfunc/BetterLyrics/image?description=1&forks=1&issues=1&language=1&name=1&owner=1&pulls=1&stargazers=1&theme=Light" width="48%">
|
||||
<img src="https://opengraph.githubassets.com/<any_hash_number>/jayfunc/BetterLyrics" width="48%">
|
||||
</div>
|
||||
</details>
|
||||
|
||||
## 🤗 欢迎反馈问题、提交代码
|
||||
<br>
|
||||
|
||||
如果发现 Bug 请在 Issues 内提出,同时也欢迎任何想法、建议。
|
||||
|
||||
## ⚠️ 免责声明
|
||||
|
||||
本项目按“原样”提供,不提供任何形式的担保。
|
||||
所有歌词、字体、图标及其他第三方资源均为其各自版权所有者的财产。
|
||||
本项目作者不主张对这些资源的所有权。
|
||||
本项目为非商业用途,不得用于侵犯任何权利。
|
||||
用户有责任确保其使用符合适用的法律和许可协议。
|
||||
|
||||
## 💭 社交媒体分享
|
||||
|
||||

|
||||
|
||||

|
||||
<div align="center">
|
||||
<mark><i>本项目正处于积极开发阶段;可能会出现意外问题。</i></mark><br>
|
||||
<sub>免责声明:本项目“按原样”提供。所有第三方资源归其各自所有者所有。</sub>
|
||||
</div>
|
||||
|
||||
304
README.md
@@ -1,247 +1,185 @@
|
||||

|
||||
[**中文**](README.CN.md) | [**English**](README.md)
|
||||
|
||||
<div align="center">
|
||||
<img src="BetterLyrics.WinUI3/BetterLyrics.WinUI3/Assets/Logo.png" alt="Logo" width="120">
|
||||
|
||||
<h1>BetterLyrics</h1>
|
||||
|
||||
<h4>
|
||||
🤩 An elegant and deeply customizable lyrics visualizer & versatile music player <br>
|
||||
Built with WinUI3 / Win2D
|
||||
</h4>
|
||||
|
||||
<div>
|
||||
<img src="https://img.shields.io/badge/Language-C%23-purple" alt="C#">
|
||||
<img src="https://img.shields.io/badge/Framework-WinUI%203-blue" alt="WinUI 3">
|
||||
<img src="https://img.shields.io/badge/License-GPL_v3.0-blue" alt="License">
|
||||
<a href="https://github.com/jayfunc/BetterLyrics/stargazers"><img src="https://img.shields.io/github/stars/jayfunc/BetterLyrics" alt="Stars"></a>
|
||||
<a href="https://crowdin.com/project/betterlyrics"><img src="https://badges.crowdin.net/betterlyrics/localized.svg" alt="Crowdin"></a>
|
||||
</div>
|
||||
|
||||
<br>
|
||||
|
||||
<img src="Promotion/banner.png" alt="Banner" width="100%" style="border-radius: 10px;">
|
||||
|
||||
<div align=center>
|
||||
<img src="BetterLyrics.WinUI3/BetterLyrics.WinUI3/Assets/Logo.png" alt="" width="96">
|
||||
</div>
|
||||
|
||||
<h2 align=center>
|
||||
BetterLyrics
|
||||
</h2>
|
||||
<br>
|
||||
|
||||
<h4 align="center">
|
||||
🤩 An elegant and deeply customizable lyrics & player app, built with WinUI3/Win2D
|
||||
</h4>
|
||||
## 🔥 Featured & Community
|
||||
|
||||
<div align="center">
|
||||
|
||||
[User Guide](https://github.com/jayfunc/BetterLyrics/wiki/User-Guide) | [Privacy Policy](PrivacyPolicy.md) | [Terms of Service](TermsofService.md)
|
||||
| Featured by HelloGitHub | Featured by SSPAI | 🤖 Ask AI |
|
||||
| :---: | :---: | :---: |
|
||||
| <a href="https://hellogithub.com/repository/jayfunc/BetterLyrics" target="_blank"><img src="https://abroad.hellogithub.com/v1/widgets/recommend.svg?rid=d2af74f0aea146ad8e4b2086982f5777&claim_uid=SgtQs9c54C8wjnv" alt="HelloGitHub" height="40"></a> | [**Read the Review Article**](https://sspai.com/post/101028) | [](https://deepwiki.com/jayfunc/BetterLyrics) <br> [](https://zread.ai/jayfunc/BetterLyrics) |
|
||||
|
||||
**Chat Groups:** [QQ Group (1054700388)](https://qun.qq.com/universal-share/share?ac=1&authKey=4Q%2BYTq3wZldYpF5SbS5c19ECFsiYoLZFAIcBNNzYpBUtiEjaZ8sZ%2F%2BnFN0qw3lad&busi_data=eyJncm91cENvZGUiOiIxMDU0NzAwMzg4IiwidG9rZW4iOiJiVnhqemVYN0N5QVc3b1ZkR24wWmZOTUtvUkJoWm1JRWlaWW5iZnlBcXJtZUtGc2FFTHNlUlFZMi9iRm03cWF5IiwidWluIjoiMTM5NTczOTY2MCJ9&data=39UmAihyH_o6CZaOs7nk2mO_lz2ruODoDou6pxxh7utcxP4WF5sbDBDOPvZ_Wqfzeey4441anegsLYQJxkrBAA&svctype=4&tempid=h5_group_info) | [Discord](https://discord.gg/5yAQPnyCKv) | [Telegram](https://t.me/+svhSLZ7awPsxNGY1)
|
||||
|
||||
</div>
|
||||
|
||||
<div align=center>
|
||||
|
||||

|
||||

|
||||

|
||||

|
||||
|
||||
</div>
|
||||
|
||||
<div align=center>
|
||||
|
||||
[](https://github.com/jayfunc/BetterLyrics/stargazers)
|
||||
[](https://crowdin.com/project/betterlyrics)
|
||||
|
||||
</div>
|
||||
|
||||
<div align=center>
|
||||
|
||||
[](https://deepwiki.com/jayfunc/BetterLyrics)
|
||||
[](https://zread.ai/jayfunc/BetterLyrics)
|
||||
|
||||
</div>
|
||||
## 🧪 Download & Install
|
||||
|
||||
<div align="center">
|
||||
|
||||
<mark>**_💞 BetterLyrics is made possible by all its contributors, bug reporters and users._**</mark>
|
||||
| Microsoft Store (Recommended) | Manual Install |
|
||||
| :---: | :---: |
|
||||
| <a href="https://apps.microsoft.com/detail/9P1WCD1P597R?referrer=appbadge&mode=direct"><img src="https://get.microsoft.com/images/en-us%20dark.svg" width="160"/></a><br>Unlimited free trial (Same as paid) | [**📦 Latest Release (.zip)**](https://github.com/jayfunc/BetterLyrics/releases/latest)<br>See [Installation Guide](https://jayfunc.blog/blog/how-to-install-zip) |
|
||||
|
||||
[📖 User Guide](https://github.com/jayfunc/BetterLyrics/wiki/User-Guide) | [🔒 Privacy Policy](PrivacyPolicy.md) | [⚖️ Terms of Service](TermsofService.md)
|
||||
|
||||
</div>
|
||||
|
||||
<div align="center">
|
||||
## 🌟 Highlighted Features
|
||||
|
||||
**_[中文版 README 请点按此处](https://github.com/jayfunc/BetterLyrics/blob/dev/README.CN.md)_**
|
||||
- 🎨 **Stunning Visuals & UI**
|
||||
- **Elegant Design:** Smooth, highly personalized style powered by WinUI3 & Win2D.
|
||||
- **Immersive Effects:** Fluid backgrounds, 3D/Fan-shaped lyrics, snowflake particles, and more.
|
||||
- **Deep Customization:** Configure animations, fonts, and behaviors to your taste.
|
||||
|
||||
<mark>**_This project is under active development; unexpected issues may occur._**</mark>
|
||||
- 🎧 **Versatile Playback & Connectivity**
|
||||
- **Built-in Player:** Play from **Local Drives** or stream via **Network Protocols** (SMB, WebDAV).
|
||||
- **External Integration:** Visualizes music from Spotify, Apple Music, NetEase, and [many others](https://github.com/jayfunc/BetterLyrics/wiki/User-Guide#known-supported-music-players-configuration-guide).
|
||||
|
||||
</div>
|
||||
- 🌐 **Advanced Lyrics System**
|
||||
- **Offline Translation:** Privacy-focused local machine translation (30+ languages).
|
||||
- **Comprehensive Sources:** .lrc (Standard/Enhanced), .eslrc, .ttml, embedded tags, and online sources (QQ Music, NetEase, LRCLIB).
|
||||
- **Apple Music:** Supports lyrics fetching (Requires token configuration).
|
||||
|
||||
## ✍️ Help us translate into your language
|
||||
- 🪟 **Display Modes for Every Scenario**
|
||||
- **Standard:** Full immersive experience.
|
||||
- **Docked:** A sleek bar attached to your screen edge.
|
||||
- **Desktop Overlay:** Lyrics floating above all apps.
|
||||
|
||||
Cannot find your language? Or have better translations? Don't worry! Start translating and becoming one of the contributors! 😆 See [here](https://github.com/jayfunc/BetterLyrics?tab=contributing-ov-file) for more info on how to contribute.
|
||||
|
||||
## 🎉 This project was recommended by HelloGithub!
|
||||
|
||||
<a href="https://hellogithub.com/repository/jayfunc/BetterLyrics" target="_blank"><img src="https://abroad.hellogithub.com/v1/widgets/recommend.svg?rid=d2af74f0aea146ad8e4b2086982f5777&claim_uid=SgtQs9c54C8wjnv" alt="Featured|HelloGitHub" style="width: 250px; height: 54px;" width="250" height="54" /></a>
|
||||
|
||||
## 🎉 This project was featured by SSPAI!
|
||||
|
||||
Check out the article: [BetterLyrics – An immersive and smooth lyrics display tool designed for Windows](https://sspai.com/post/101028).
|
||||
|
||||
## 🔈 Feedback and chat group
|
||||
|
||||
[QQ 群](https://qun.qq.com/universal-share/share?ac=1&authKey=4Q%2BYTq3wZldYpF5SbS5c19ECFsiYoLZFAIcBNNzYpBUtiEjaZ8sZ%2F%2BnFN0qw3lad&busi_data=eyJncm91cENvZGUiOiIxMDU0NzAwMzg4IiwidG9rZW4iOiJiVnhqemVYN0N5QVc3b1ZkR24wWmZOTUtvUkJoWm1JRWlaWW5iZnlBcXJtZUtGc2FFTHNlUlFZMi9iRm03cWF5IiwidWluIjoiMTM5NTczOTY2MCJ9&data=39UmAihyH_o6CZaOs7nk2mO_lz2ruODoDou6pxxh7utcxP4WF5sbDBDOPvZ_Wqfzeey4441anegsLYQJxkrBAA&svctype=4&tempid=h5_group_info) (1054700388) | [Discord Server](https://discord.gg/5yAQPnyCKv) | [Telegram Group](https://t.me/+svhSLZ7awPsxNGY1)
|
||||
|
||||
## 🌟 Highlighted features
|
||||
|
||||
- 🌠 **Pleasing User Interface**
|
||||
- Smooth and highly personalized style, animations and effects
|
||||
- Immersive fluid background
|
||||
- Perspective/fan-shaped lyrics
|
||||
- Snowflake effect
|
||||
- Multiple lyrics scrolling functions
|
||||
- ... (and more)
|
||||
- ↔️ **Strong Lyrics Translation**
|
||||
- Offline machine translation (supporting 30+ languages)
|
||||
- Auto-reading local lyrics files for embedded translation
|
||||
- 🧩 **Various Lyrics Source**
|
||||
- 💾 Local storage
|
||||
- Music files (with embedded lyrics)
|
||||
- [.lrc](<https://en.wikipedia.org/wiki/LRC_(file_format)>) files (with both core format and enhanced format)
|
||||
- [.eslrc](https://github.com/ESLyric/release) files
|
||||
- [.ttml](https://en.wikipedia.org/wiki/Timed_Text_Markup_Language) files
|
||||
- ☁️ Online lyrics providers
|
||||
- QQ 音乐
|
||||
- 网易云音乐
|
||||
- 酷狗音乐
|
||||
- [amll-ttml-db](https://github.com/Steve-xmh/amll-ttml-db)
|
||||
- [LRCLIB](https://lrclib.net/)
|
||||
- <details><summary>⚠️ Apple Music (additional config needed)</summary>
|
||||
|
||||
- Open the Apple Music web app and the Developer Tools window. Refresh the page. Return to the Developer Tools window, select Fetch/XHR, select a request, find the Media-User-Token header in the request header, and copy its value.
|
||||
- Open BetterLyrics and go to the Playback Source settings. Enter the copied value in the Media-User-Token (for Apple Music) setting and click the accept icon on the right-hand side.
|
||||
|
||||
- 🎶 **Multiple Music Players Supported**
|
||||
|
||||
- Check it out [here](https://github.com/jayfunc/BetterLyrics/wiki/User-Guide#known-supported-music-players-configuration-guide) for detailed info
|
||||
|
||||
- 🪟 **Multiple Display Modes**
|
||||
- **Standard Mode**
|
||||
- Enjoy an immersive listening journey with rich lyrics, animations and beautifully dynamic backgrounds
|
||||
- **Docked Mode**
|
||||
- A smart animated lyrics bar docked to your screen edge
|
||||
- **Desktop Mode**
|
||||
- Enjoy immersive lyrics floating above your apps
|
||||
- **And More...**
|
||||
- Waiting for you to discover...
|
||||
- 🧠 **Smart Behaviors**
|
||||
- Auto hide when music paused
|
||||
- Auto-hides when music pauses.
|
||||
|
||||
## 🖼️ Screenshots
|
||||
|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||
<div align="center">
|
||||
|
||||
> ⚠️ Due to GIF format and frame rate limitations, the displayed effect is for preview only. Please refer to the actual device for the actual effect.
|
||||
| Standard View | Narrow Mode |
|
||||
| :---: | :---: |
|
||||
| <img src="Screenshots/std.png" width="100%"> | <img src="Screenshots/narrow.png" width="100%"> |
|
||||
|
||||

|
||||

|
||||
| Lyrics Visual Effects | Coexisting Modes |
|
||||
| :---: | :---: |
|
||||
| <img src="Screenshots/effect.png" width="100%"> | <img src="Screenshots/all-in-one.png" width="100%"> |
|
||||
|
||||
| Fullscreen Mode | Fullscreen Mode |
|
||||
| :---: | :---: |
|
||||
| <img src="Screenshots/fs3.png" width="100%"> | <img src="Screenshots/fs2.png" width="100%"> |
|
||||
|
||||
| Music Gallery | Playback Statistics |
|
||||
| :---: | :---: |
|
||||
| <img src="Screenshots/music-gallery.png" width="100%"> | <img src="Screenshots/stats.png" width="100%"> |
|
||||
|
||||
</div>
|
||||
|
||||
## 📹 Demonstration
|
||||
|
||||
Watch our demo video (uploaded on 21 Oct 2025) on Bilibili [here](https://www.bilibili.com/video/BV1QRstz1EGt/).
|
||||
> Watch our demo video (uploaded on 21 Oct 2025) on Bilibili [here](https://www.bilibili.com/video/BV1QRstz1EGt/).
|
||||
|
||||
## 🧪 Try it now
|
||||
## ✍️ Contribute & Build
|
||||
|
||||
<a href="https://apps.microsoft.com/detail/9P1WCD1P597R?referrer=appbadge&mode=direct">
|
||||
<img src="https://get.microsoft.com/images/en-us%20dark.svg" width="200"/>
|
||||
</a>
|
||||
**Help us translate:** Cannot find your language? [Start translating here](https://github.com/jayfunc/BetterLyrics?tab=contributing-ov-file).
|
||||
|
||||
**Unlimited** free trail or purchase (there is **no difference** between free and paid version).
|
||||
|
||||
If you find it useful, please consider [donating](#-donations) or purchasing it in **Microsoft Store**, I'll appreciate it! 🥰
|
||||
|
||||
Having trouble downloading and installing from the MS Store? Try the following options:
|
||||
- [Download from outside Microsoft Store](https://jayfunc.blog/blog/download-from-outside-ms-store)
|
||||
- Go to [latest release](https://github.com/jayfunc/BetterLyrics/releases/latest) and download `.zip` file from `Assets`. (See [this doc](https://jayfunc.blog/blog/how-to-install-zip) for how to install it.)
|
||||
|
||||
## 🏗️ Build
|
||||
|
||||
Before you build, make sure that you have already:
|
||||
- Replaced `BetterLyrics\BetterLyrics.WinUI3\BetterLyrics.WinUI3\Constants\DiscordTemplate` with `BetterLyrics\BetterLyrics.WinUI3\BetterLyrics.WinUI3\Constants\DiscordTemplate.cs`.
|
||||
- Replaced `BetterLyrics\BetterLyrics.WinUI3\BetterLyrics.WinUI3\Constants\LastFMTemplate` with `BetterLyrics\BetterLyrics.WinUI3\BetterLyrics.WinUI3\Constants\LastFM.cs`.
|
||||
**Build from source:**
|
||||
> Before building, ensure you have replaced `DiscordTemplate.cs` and `LastFM.cs` in the `Constants` folder.
|
||||
|
||||
## 🤑 Donations
|
||||
|
||||
If you like this project, please consider supporting it by donating. Your support will help keep the project alive and encourage further development.
|
||||
If you like BetterLyrics, please consider supporting it. Your support helps keep the project alive!
|
||||
|
||||
You can donate via:
|
||||
- [PayPal](https://paypal.me/zhefangpay)
|
||||
- [Buy Me a Coffee](https://buymeacoffee.com/founchoo)
|
||||
- [爱发电](https://afdian.com/a/jayfunc)
|
||||
- <details><summary>支付宝</summary>
|
||||
<div align="center">
|
||||
|
||||

|
||||
| Web Platforms | Alipay (QR) | WeChat (QR) |
|
||||
| :---: | :---: | :---: |
|
||||
| [PayPal](https://paypal.me/zhefangpay)<br><br>[Buy Me a Coffee](https://buymeacoffee.com/founchoo)<br><br>[爱发电 (Afdian)](https://afdian.com/a/jayfunc) | <img src="Donate/Alipay.jpg" width="150"> | <img src="Donate/WeChatReward.png" width="150"> |
|
||||
|
||||
</detais>
|
||||
**[View the full Hall of Fame (Sponsors)](SPONSORS.md)**
|
||||
|
||||
- <details><summary>微信</summary>
|
||||
</div>
|
||||
|
||||

|
||||
## ⭐ Star History
|
||||
|
||||
</details>
|
||||
<div align="center">
|
||||
<img src="https://api.star-history.com/svg?repos=jayfunc/BetterLyrics&type=Date" width="100%">
|
||||
</div>
|
||||
|
||||
This project is made possible by the generous support of our users. **[View the full Hall of Fame](SPONSORS.md)**
|
||||
## 📄 License & Credits
|
||||
|
||||
## 📄 License
|
||||
This project is licensed under the **GNU General Public License v3.0**.
|
||||
|
||||
This project is licensed under the GNU General Public License v3.0. See the [LICENSE](https://github.com/jayfunc/BetterLyrics/blob/dev/LICENSE) file for details.
|
||||
<details>
|
||||
<summary><b>💖 Special Thanks, Credits & Inspiration</b></summary>
|
||||
<br>
|
||||
|
||||
## 💖 Many thanks to
|
||||
|
||||
Some functions and code are referenced or modified from public repositories, including but not limited to the following open source projects/packages, tutorials, etc., and we would like to express our gratitude to them here.
|
||||
**Dependencies & References:**
|
||||
|
||||
| Projects/Packages | Description |
|
||||
| :--- | :--- |
|
||||
| [Lyricify-Lyrics-Helper](https://github.com/WXRIW/Lyricify-Lyrics-Helper) | Provide lyrics fetch, decryption, and parsing for QQ, Netease, and Kugou sources |
|
||||
| [lrclib](https://github.com/tranxuanthang/lrclib) | LRCLIB lyrics API provider |
|
||||
| [Manzana-Apple-Music-Lyrics](https://github.com/dropcreations/Manzana-Apple-Music-Lyrics) | Apple Music lyrics fetch using Python |
|
||||
| [Audio Tools Library (ATL) for .NET](https://github.com/Zeugma440/atldotnet) | Used for extracting pictures from music files |
|
||||
| [WinUIEx](https://github.com/dotMorten/WinUIEx) | Provide easy ways to access the Win32 API regarding windowing |
|
||||
| [cutlet](https://github.com/polm/cutlet) | Provide the ability for converting Japanese to romaji |
|
||||
| [DevWinUI](https://github.com/ghost1372/DevWinUI) | Provide many out-of-the-box features for building WinUI 3 applications |
|
||||
| [Isolation](https://github.com/Storyteller-Studios/Isolation) | Dynamic fluid background implementation |
|
||||
| [LibreTranslate](https://github.com/LibreTranslate/LibreTranslate) | Provide the ability for offline lyrics translation |
|
||||
| [lrclib](https://github.com/tranxuanthang/lrclib) | LRCLIB lyrics API provider |
|
||||
| [Lyricify-Lyrics-Helper](https://github.com/WXRIW/Lyricify-Lyrics-Helper) | Provide lyrics fetch, decryption, and parsing for QQ, Netease, and Kugou sources |
|
||||
| [Manzana-Apple-Music-Lyrics](https://github.com/dropcreations/Manzana-Apple-Music-Lyrics) | Apple Music lyrics fetch using Python |
|
||||
| [SpectrumVisualization](https://github.com/Johnwikix/SpectrumVisualization) | Audio visualization reference |
|
||||
| [TagLib#](https://github.com/mono/taglib-sharp) | Used for reading the original lyrics content |
|
||||
| [Vanara](https://github.com/dahall/Vanara) | Win32 API wrapper |
|
||||
| [LibreTranslate](https://github.com/LibreTranslate/LibreTranslate) | Provide the ability for offline lyrics translation |
|
||||
| [Isolation](https://github.com/Storyteller-Studios/Isolation) | Dynamic fluid background implementation |
|
||||
| [SpectrumVisualization](https://github.com/Johnwikix/SpectrumVisualization) | Audio visualization reference |
|
||||
| [DevWinUI](https://github.com/ghost1372/DevWinUI) | Provide many out-of-the-box features for building WinUI 3 applications |
|
||||
| ... | ... |
|
||||
| [WinUIEx](https://github.com/dotMorten/WinUIEx) | Provide easy ways to access the Win32 API regarding windowing |
|
||||
|
||||
See all the dependencies [here](https://github.com/jayfunc/BetterLyrics/network/dependencies).
|
||||
See [dependencies](https://github.com/jayfunc/BetterLyrics/network/dependencies) for full list.
|
||||
|
||||
### Tutorials/Blogs/etc.
|
||||
<br>
|
||||
|
||||
- [Stackoverflow - How to animate Margin property in WPF](https://stackoverflow.com/a/21542882/11048731)
|
||||
- [Bilibili -【WinUI3】SystemBackdropController:定义云母、亚克力效果](https://www.bilibili.com/video/BV1PY4FevEkS)
|
||||
- [cnblogs - .NET App 与 Windows 系统媒体控制(SMTC)交互](https://www.cnblogs.com/TwilightLemon/p/18279496)
|
||||
- [Win2D 中的游戏循环:CanvasAnimatedControl](https://www.cnblogs.com/walterlv/p/10236395.html)
|
||||
- [r2d2rigo/Win2D-Samples](https://github.com/r2d2rigo/Win2D-Samples/blob/master/IrisBlurWin2D/IrisBlurWin2D/MainPage.xaml.cs)
|
||||
- [CommunityToolkit - 从入门到精通](https://mvvm.coldwind.top/)
|
||||
|
||||
## 💡 Inspired by
|
||||
|
||||
Some design ideas are referenced from the following plugins/software (excluding code that is indirectly or directly referenced or modified, and is only used as a guide for design ideas).
|
||||
**💡 Inspired by:**
|
||||
|
||||
Some design ideas are referenced from the following projects (design inspiration only):
|
||||
- [refined-now-playing-netease](https://github.com/solstice23/refined-now-playing-netease)
|
||||
- [Lyricify-App](https://github.com/WXRIW/Lyricify-App)
|
||||
- [椒盐音乐 Salt Player](https://moriafly.com/program/salt-player)
|
||||
- [Salt Player](https://moriafly.com/program/salt-player)
|
||||
- [MyToolBar](https://github.com/TwilightLemon/MyToolBar)
|
||||
|
||||
## ⭐ Star history
|
||||
</details>
|
||||
|
||||
<div style="display: flex; justify-content: space-around; align-items: flex-start;">
|
||||
<img src="https://api.star-history.com/svg?repos=jayfunc/BetterLyrics&type=Date)](https://www.star-history.com/#jayfunc/BetterLyrics&Date" width="100%" >
|
||||
## 💭 Share on Social Media
|
||||
|
||||
<details>
|
||||
<summary><b>Click to expand</b></summary>
|
||||
<br>
|
||||
<div align="center">
|
||||
<img src="https://socialify.git.ci/jayfunc/BetterLyrics/image?description=1&forks=1&issues=1&language=1&name=1&owner=1&pulls=1&stargazers=1&theme=Light" width="48%">
|
||||
<img src="https://opengraph.githubassets.com/<any_hash_number>/jayfunc/BetterLyrics" width="48%">
|
||||
</div>
|
||||
</details>
|
||||
|
||||
## 🤗 Any issues and PRs are welcome
|
||||
<br>
|
||||
|
||||
If you find a bug, please file it in issues, or if you have any ideas, feel free to share them here.
|
||||
|
||||
## ⚠️ Disclaimer
|
||||
|
||||
This project is provided "as is" without warranty of any kind.
|
||||
|
||||
All lyrics, fonts, icons, and other third-party resources are the property of their respective copyright holders.
|
||||
The author of this project does not claim ownership of such resources.
|
||||
|
||||
This project is non-commercial and should not be used to infringe any rights.
|
||||
Users are responsible for ensuring their own use complies with applicable laws and licenses.
|
||||
|
||||
## 💭 Share it on social media
|
||||
|
||||

|
||||
|
||||

|
||||
<div align="center">
|
||||
<mark><i>This project is under active development; unexpected issues may occur.</i></mark><br>
|
||||
<sub>Disclaimer: This project is provided "as is". All third-party resources belong to their respective owners.</sub>
|
||||
</div>
|
||||
|
||||
|
Before Width: | Height: | Size: 37 MiB |
|
Before Width: | Height: | Size: 15 MiB |
|
Before Width: | Height: | Size: 620 KiB |
|
Before Width: | Height: | Size: 629 KiB |
BIN
Screenshots/all-in-one.png
Normal file
|
After Width: | Height: | Size: 895 KiB |
BIN
Screenshots/effect.png
Normal file
|
After Width: | Height: | Size: 1.0 MiB |
BIN
Screenshots/fs3.png
Normal file
|
After Width: | Height: | Size: 506 KiB |
BIN
Screenshots/music-gallery.png
Normal file
|
After Width: | Height: | Size: 507 KiB |
BIN
Screenshots/stats.png
Normal file
|
After Width: | Height: | Size: 173 KiB |