mirror of
https://github.com/jayfunc/BetterLyrics.git
synced 2026-01-12 19:24:55 +08:00
chores: improve music stats
This commit is contained in:
@@ -86,6 +86,7 @@
|
||||
<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.EntityFrameworkCore" Version="10.0.1" />
|
||||
<PackageReference Include="Microsoft.EntityFrameworkCore.Abstractions" 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
|
||||
@@ -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="*" />
|
||||
<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="1.5*" />
|
||||
<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}" />
|
||||
|
||||
<ListView
|
||||
Grid.Row="1"
|
||||
ItemContainerStyle="{StaticResource ListViewStretchedItemContainerStyle}"
|
||||
ItemsSource="{x:Bind ViewModel.TopSongs, Mode=OneWay}"
|
||||
SelectionMode="None">
|
||||
<ListView.ItemTemplate>
|
||||
<DataTemplate x:DataType="statsmodels:SongPlayCount">
|
||||
<Grid Margin="0,4">
|
||||
<Grid.ColumnDefinitions>
|
||||
<ColumnDefinition Width="Auto" />
|
||||
<ColumnDefinition Width="*" />
|
||||
<ColumnDefinition Width="Auto" />
|
||||
</Grid.ColumnDefinitions>
|
||||
<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
|
||||
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
|
||||
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="" />
|
||||
<StackPanel Margin="20">
|
||||
<TextBlock
|
||||
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 x:Uid="StatsDashboardControlTrackCountText" />
|
||||
</Paragraph>
|
||||
</RichTextBlock>
|
||||
</StackPanel>
|
||||
</Grid>
|
||||
|
||||
<StackPanel Grid.Column="1" VerticalAlignment="Center">
|
||||
<TextBlock Style="{ThemeResource BodyStrongTextBlockStyle}" Text="{x:Bind Title}" />
|
||||
<TextBlock
|
||||
Foreground="{ThemeResource SystemControlForegroundBaseMediumBrush}"
|
||||
Style="{ThemeResource CaptionTextBlockStyle}"
|
||||
Text="{x:Bind Artist}" />
|
||||
</StackPanel>
|
||||
|
||||
<TextBlock
|
||||
Grid.Column="2"
|
||||
VerticalAlignment="Center"
|
||||
FontWeight="SemiBold">
|
||||
<Run Text="{x:Bind PlayCount}" />
|
||||
<Run
|
||||
FontSize="10"
|
||||
FontWeight="Normal"
|
||||
Foreground="{ThemeResource SystemControlForegroundBaseMediumBrush}"
|
||||
Text="plays" />
|
||||
</TextBlock>
|
||||
</Grid>
|
||||
</DataTemplate>
|
||||
</ListView.ItemTemplate>
|
||||
</ListView>
|
||||
</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>
|
||||
</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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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"
|
||||
}
|
||||
}
|
||||
@@ -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;
|
||||
@@ -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>
|
||||
@@ -184,7 +184,7 @@
|
||||
<value>解析中...</value>
|
||||
</data>
|
||||
<data name="FileSystemServicePrepareToClean" xml:space="preserve">
|
||||
<value>キャッシュのクリアを準備中...</value>
|
||||
<value>キャッシュクリア準備中...</value>
|
||||
</data>
|
||||
<data name="FileSystemServiceReady" xml:space="preserve">
|
||||
<value>準備完了</value>
|
||||
@@ -394,7 +394,7 @@
|
||||
<value>ローカルフォルダー</value>
|
||||
</data>
|
||||
<data name="MediaSettingsControlNameSetting.Header" xml:space="preserve">
|
||||
<value>名前</value>
|
||||
<value>名称</value>
|
||||
</data>
|
||||
<data name="MediaSettingsControlSyncNow.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>
|
||||
@@ -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>
|
||||
@@ -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>
|
||||
@@ -874,13 +874,13 @@
|
||||
<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>
|
||||
@@ -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>
|
||||
@@ -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>
|
||||
@@ -1147,7 +1147,7 @@
|
||||
<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,7 +1213,7 @@
|
||||
<value>スポンサー</value>
|
||||
</data>
|
||||
<data name="SettingsPagePhonetic.Text" xml:space="preserve">
|
||||
<value>歌詞のルビ</value>
|
||||
<value>歌詞ルビ</value>
|
||||
</data>
|
||||
<data name="SettingsPagePhoneticText.Header" xml:space="preserve">
|
||||
<value>ルビ</value>
|
||||
@@ -1246,10 +1246,10 @@
|
||||
<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>
|
||||
@@ -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>
|
||||
@@ -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="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>
|
||||
@@ -1516,7 +1546,7 @@
|
||||
<value>再起動</value>
|
||||
</data>
|
||||
<data name="SystemTraySearch.Text" xml:space="preserve">
|
||||
<value>歌詞の検索ウィンドウ</value>
|
||||
<value>歌詞検索ウィンドウ</value>
|
||||
</data>
|
||||
<data name="SystemTraySettings.Text" 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>
|
||||
|
||||
@@ -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>
|
||||
@@ -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">
|
||||
<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>
|
||||
</data>
|
||||
|
||||
@@ -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" />
|
||||
|
||||
<TextBlock
|
||||
x:Uid="MusicGalleryPageFolder"
|
||||
<StackPanel
|
||||
Grid.Row="3"
|
||||
Margin="1,4,0,6"
|
||||
Style="{StaticResource SettingsSectionHeaderTextBlockStyle}" />
|
||||
Orientation="Horizontal"
|
||||
Spacing="3">
|
||||
<TextBlock
|
||||
x:Uid="MusicGalleryPageFolder"
|
||||
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"
|
||||
|
||||
Reference in New Issue
Block a user