Compare commits

..

5 Commits

Author SHA1 Message Date
Zhe Fang
c576635af2 Merge branch 'dev' of https://github.com/jayfunc/BetterLyrics into dev 2026-01-01 21:49:33 -05:00
Zhe Fang
c8590202ec chores: improve music stats 2026-01-01 21:49:31 -05:00
Zhe Fang
2dc8b1283f Update README.CN.md 2026-01-01 12:38:31 -05:00
Zhe Fang
c482edea0f Update README.md 2026-01-01 12:36:39 -05:00
Zhe Fang
315722252c Update README.md 2026-01-01 12:32:01 -05:00
31 changed files with 1117 additions and 389 deletions

View File

@@ -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" />

View File

@@ -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>

View File

@@ -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="&#xE8D6;" />
<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>

View File

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

View File

@@ -6,10 +6,11 @@ namespace BetterLyrics.WinUI3.Enums
{
public enum StatsRange
{
Day,
Week,
Month,
Quarter,
Year
Today,
ThisWeek,
ThisMonth,
ThisQuarter,
ThisYear,
Custom
}
}

View File

@@ -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公式

View File

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

View File

@@ -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"
}
}

View File

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

View File

@@ -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>

View File

@@ -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>

View File

@@ -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>

View File

@@ -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>

View File

@@ -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>

View File

@@ -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>

View File

@@ -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>

View File

@@ -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>

View File

@@ -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>

View File

@@ -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>

View File

@@ -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>

View File

@@ -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>

View File

@@ -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>

View File

@@ -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>

View File

@@ -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>

View File

@@ -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>

View File

@@ -235,5 +235,11 @@ namespace BetterLyrics.WinUI3.ViewModels
await dialog.ShowAsync();
}
[RelayCommand]
private void OpenMusicGalleryWindow()
{
WindowHook.OpenOrShowWindow<MusicGalleryWindow>();
}
}
}

View File

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

View File

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

View File

@@ -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=&#xE713;}" Style="{StaticResource GhostButtonStyle}" />
</StackPanel>
<TreeView
x:Name="FolderTreeView"

View File

@@ -137,18 +137,20 @@
**依赖与引用:**
| 项目/包 | 描述 |
| 项目/包 (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 歌词获取 |
| [Audio Tools Library (ATL)](https://github.com/Zeugma440/atldotnet) | 从音乐文件中提取图片 |
| [WinUIEx](https://github.com/dotMorten/WinUIEx) | 简化 Win32 API 的窗口访问 |
| [TagLib#](https://github.com/mono/taglib-sharp) | 读取原始歌词内容 |
| [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 封装库 |
| [LibreTranslate](https://github.com/LibreTranslate/LibreTranslate) | 离线歌词翻译支持 |
| [Isolation](https://github.com/Storyteller-Studios/Isolation) | 动态流体背景实现 |
| [DevWinUI](https://github.com/ghost1372/DevWinUI) | WinUI 3 开发辅助工具 |
| [WinUIEx](https://github.com/dotMorten/WinUIEx) | 提供访问与窗口管理相关的 Win32 API 的便捷方式 |
查看 [完整依赖列表](https://github.com/jayfunc/BetterLyrics/network/dependencies)。

View File

@@ -139,16 +139,18 @@ This project is licensed under the **GNU General Public License v3.0**.
| Projects/Packages | Description |
| :--- | :--- |
| [Lyricify-Lyrics-Helper](https://github.com/WXRIW/Lyricify-Lyrics-Helper) | Lyrics fetch/decrypt for QQ, Netease, Kugou |
| [Audio Tools Library (ATL) for .NET](https://github.com/Zeugma440/atldotnet) | Used for extracting pictures from music files |
| [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 |
| [Manzana-Apple-Music-Lyrics](https://github.com/dropcreations/Manzana-Apple-Music-Lyrics) | Apple Music lyrics fetch |
| [Audio Tools Library (ATL)](https://github.com/Zeugma440/atldotnet) | Picture extraction from music files |
| [WinUIEx](https://github.com/dotMorten/WinUIEx) | Win32 API windowing access |
| [TagLib#](https://github.com/mono/taglib-sharp) | Reading original lyrics content |
| [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) | Offline lyrics translation |
| [Isolation](https://github.com/Storyteller-Studios/Isolation) | Dynamic fluid background |
| [DevWinUI](https://github.com/ghost1372/DevWinUI) | WinUI 3 helpers |
| [WinUIEx](https://github.com/dotMorten/WinUIEx) | Provide easy ways to access the Win32 API regarding windowing |
See [dependencies](https://github.com/jayfunc/BetterLyrics/network/dependencies) for full list.