Compare commits

...

83 Commits

Author SHA1 Message Date
Zhe Fang
0284b1de81 Update README.CN.md 2025-12-30 21:46:32 -05:00
Zhe Fang
108c2cd34b Update README.md 2025-12-30 21:45:56 -05:00
Zhe Fang
390e30f7f5 chores: bump to v1.2.232.0 2025-12-30 20:54:40 -05:00
Zhe Fang
900774668d chores: i18n 2025-12-30 20:09:02 -05:00
Zhe Fang
6ca2d1f897 chores 2025-12-30 19:49:54 -05:00
Zhe Fang
164bd077b8 fix: app crash when audio device was not found 2025-12-30 14:30:10 -05:00
Zhe Fang
8ec71fcfb7 chores: update StatsDashboardControl 2025-12-30 14:04:08 -05:00
Zhe Fang
f39ad54df8 fix: record play history 2025-12-30 13:02:23 -05:00
Zhe Fang
9b809983df chores: i18n 2025-12-30 08:59:30 -05:00
Zhe Fang
8006b3a443 chores: i18n 2025-12-30 08:41:12 -05:00
Zhe Fang
26a7454de2 feat: play history 2025-12-30 08:02:48 -05:00
Zhe Fang
0793a074cf fix: add to playlists 2025-12-29 16:11:21 -05:00
Zhe Fang
125bf1682e chores 2025-12-29 12:15:39 -05:00
Zhe Fang
48bdffb2fe Merge pull request #179 from jayfunc/l10n_dev
New Crowdin updates
2025-12-28 21:37:57 -05:00
Zhe Fang
d324a7552f New translations resources.resw (Chinese Traditional) 2025-12-28 21:37:17 -05:00
Zhe Fang
78c308c393 New translations resources.resw (Japanese) 2025-12-28 21:37:15 -05:00
Zhe Fang
a1bba00db6 chores: i18n 2025-12-28 21:31:37 -05:00
Zhe Fang
0787f5b111 fix 2025-12-28 21:10:02 -05:00
Zhe Fang
884026594b fix: ignore system, hidden files and unsupported format files 2025-12-28 21:03:56 -05:00
Zhe Fang
b0a777db8d chores: adjust layout and fix bugs 2025-12-28 20:01:41 -05:00
Zhe Fang
83f3a3bd6d chores: fix SMB and local file system, add auto-sync, improve lyruics search, album art search, local music gallery load speed (after 1st time) 2025-12-27 15:25:49 -05:00
Zhe Fang
bfb2ed29e5 fix: window title is synced with config name 2025-12-25 13:44:43 -05:00
Zhe Fang
131a0f0eb1 Merge pull request #172 from jayfunc/l10n_dev
New Crowdin updates
2025-12-24 19:24:20 -05:00
Zhe Fang
ac2a7b3f7b New translations resources.resw (Malay) 2025-12-24 19:22:52 -05:00
Zhe Fang
36eea7f8f2 New translations resources.resw (Hindi) 2025-12-24 19:22:52 -05:00
Zhe Fang
6b338deb55 New translations resources.resw (Thai) 2025-12-24 19:22:51 -05:00
Zhe Fang
af323ecd00 New translations resources.resw (Indonesian) 2025-12-24 19:22:50 -05:00
Zhe Fang
c79d01c75b New translations resources.resw (Vietnamese) 2025-12-24 19:22:49 -05:00
Zhe Fang
b51ec1e60f New translations resources.resw (Chinese Traditional) 2025-12-24 19:22:48 -05:00
Zhe Fang
7fe925bcba New translations resources.resw (Chinese Simplified) 2025-12-24 19:22:47 -05:00
Zhe Fang
0626472d66 New translations resources.resw (Russian) 2025-12-24 19:22:46 -05:00
Zhe Fang
33099bc186 New translations resources.resw (Portuguese) 2025-12-24 19:22:45 -05:00
Zhe Fang
e653efc227 New translations resources.resw (Korean) 2025-12-24 19:22:44 -05:00
Zhe Fang
074fef3faf New translations resources.resw (Japanese) 2025-12-24 19:22:43 -05:00
Zhe Fang
029cbbd343 New translations resources.resw (German) 2025-12-24 19:22:42 -05:00
Zhe Fang
802b2a4c1c New translations resources.resw (Arabic) 2025-12-24 19:22:41 -05:00
Zhe Fang
eccc4d519c New translations resources.resw (Spanish) 2025-12-24 19:22:39 -05:00
Zhe Fang
5f274ea28a New translations resources.resw (French) 2025-12-24 19:22:37 -05:00
Zhe Fang
aa1a1f5d58 chores: i18n 2025-12-24 19:22:16 -05:00
Zhe Fang
3a56d53487 New translations resources.resw (Malay) 2025-12-24 19:15:10 -05:00
Zhe Fang
bbc5eb772c New translations resources.resw (Hindi) 2025-12-24 19:15:09 -05:00
Zhe Fang
05b491052b New translations resources.resw (Thai) 2025-12-24 19:15:08 -05:00
Zhe Fang
8accbf0431 New translations resources.resw (Indonesian) 2025-12-24 19:15:07 -05:00
Zhe Fang
1174209c2a New translations resources.resw (Vietnamese) 2025-12-24 19:15:06 -05:00
Zhe Fang
23ed719046 New translations resources.resw (Chinese Traditional) 2025-12-24 19:15:05 -05:00
Zhe Fang
a34f00662e New translations resources.resw (Chinese Simplified) 2025-12-24 19:15:04 -05:00
Zhe Fang
f783314258 New translations resources.resw (Russian) 2025-12-24 19:15:03 -05:00
Zhe Fang
215a39c5d5 New translations resources.resw (Portuguese) 2025-12-24 19:15:02 -05:00
Zhe Fang
16bcef5f64 New translations resources.resw (Korean) 2025-12-24 19:15:01 -05:00
Zhe Fang
fbba9a3c36 New translations resources.resw (Japanese) 2025-12-24 19:15:00 -05:00
Zhe Fang
f205ab0364 New translations resources.resw (German) 2025-12-24 19:14:59 -05:00
Zhe Fang
10314f3c2f New translations resources.resw (Arabic) 2025-12-24 19:14:58 -05:00
Zhe Fang
b4710e87d3 New translations resources.resw (Spanish) 2025-12-24 19:14:57 -05:00
Zhe Fang
282a934cd2 New translations resources.resw (French) 2025-12-24 19:14:56 -05:00
Zhe Fang
b4c4e394ef Merge branch 'dev' of https://github.com/jayfunc/BetterLyrics into dev 2025-12-24 18:36:28 -05:00
Zhe Fang
17cfdf37bd chores: i18n 2025-12-24 18:36:26 -05:00
Zhe Fang
900a8e1e7c Update credit wording in CONTRIBUTING.md 2025-12-24 11:55:18 -05:00
Zhe Fang
ea9a9c2f5f Update translation contribution instructions in README
Added a link for contributors to find more information.
2025-12-24 11:52:00 -05:00
Zhe Fang
0c4d02b337 Revise translation assistance information
Updated translation assistance section with a link for contributions.
2025-12-24 11:51:38 -05:00
Zhe Fang
d137d82ecf Update translation assistance section in README
Added a section for translation assistance and removed the previous translation section.
2025-12-24 11:51:07 -05:00
Zhe Fang
02551e2053 Add translation contribution section to README
Added a section encouraging users to help translate the project and contribute.
2025-12-24 11:50:10 -05:00
Zhe Fang
026926e9b8 Update CONTRIBUTING.md 2025-12-24 11:39:08 -05:00
Zhe Fang
4c811db16a Update README.CN.md with translation and donation info
Added a section for translation contributions and donation support.
2025-12-24 11:36:29 -05:00
Zhe Fang
6f83fa11db Revise contributing guidelines for translations
Updated the contributing guidelines to include translation information in both English and Chinese. Added a status table for languages and contributors.
2025-12-24 11:34:55 -05:00
Zhe Fang
bc8e15c144 Update translation section in README.md
Added a section for translation contributions and removed the previous translation details.
2025-12-24 11:32:16 -05:00
Zhe Fang
85de1eb2cd Add Chinese translation guidelines to CONTRIBUTING.md 2025-12-24 11:29:00 -05:00
Zhe Fang
d2bf19ed3d Add translation contribution guidelines
Added instructions for translating BetterLyrics using Crowdin.
2025-12-24 11:27:23 -05:00
Zhe Fang
43c205c839 Update Japanese language support status in README 2025-12-24 11:07:35 -05:00
Zhe Fang
9664b1ab78 Update Japanese language entry in README.CN.md 2025-12-24 11:07:00 -05:00
Zhe Fang
08c5f6b515 Add contributor link for Japanese language support 2025-12-24 11:06:31 -05:00
Zhe Fang
260de40f81 Merge branch 'dev' of https://github.com/jayfunc/BetterLyrics into dev 2025-12-24 11:05:41 -05:00
Zhe Fang
c00d0eb005 fix: duration issue 2025-12-24 11:05:39 -05:00
Zhe Fang
32e761724c Merge pull request #170 from jayfunc/l10n_dev
New Crowdin updates
2025-12-24 11:05:05 -05:00
Zhe Fang
9fd08af582 New translations resources.resw (Japanese) 2025-12-24 11:03:57 -05:00
Zhe Fang
266dcfc930 New translations resources.resw (Chinese Simplified) 2025-12-24 10:43:52 -05:00
Zhe Fang
8764585f2c New translations resources.resw (Japanese) 2025-12-24 10:43:50 -05:00
Zhe Fang
91ab3a48c0 New translations resources.resw (Chinese Simplified) 2025-12-24 09:23:59 -05:00
Zhe Fang
80fa34d9e8 New translations resources.resw (Japanese) 2025-12-24 09:23:58 -05:00
Zhe Fang
b4ca4fd990 New translations resources.resw (Chinese Traditional) 2025-12-24 08:00:35 -05:00
Zhe Fang
86527f6b82 New translations resources.resw (Japanese) 2025-12-24 08:00:34 -05:00
Zhe Fang
d8066bc683 New translations resources.resw (Japanese) 2025-12-24 06:04:12 -05:00
Zhe Fang
b261a86791 New translations resources.resw (Japanese) 2025-12-24 04:35:20 -05:00
Zhe Fang
34f2a51b74 New translations resources.resw (Japanese) 2025-12-24 00:10:01 -05:00
110 changed files with 7266 additions and 5469 deletions

View File

@@ -12,7 +12,7 @@
<Identity <Identity
Name="37412.BetterLyrics" Name="37412.BetterLyrics"
Publisher="CN=E1428B0E-DC1D-4EA4-ACB1-4556569D5BA9" Publisher="CN=E1428B0E-DC1D-4EA4-ACB1-4556569D5BA9"
Version="1.1.221.0" /> Version="1.2.232.0" />
<mp:PhoneIdentity PhoneProductId="ca4a4830-fc19-40d9-b823-53e2bff3d816" PhonePublisherId="00000000-0000-0000-0000-000000000000"/> <mp:PhoneIdentity PhoneProductId="ca4a4830-fc19-40d9-b823-53e2bff3d816" PhonePublisherId="00000000-0000-0000-0000-000000000000"/>

View File

@@ -75,6 +75,7 @@
<converter:LyricsLayoutOrientationToOrientationConverter x:Key="LyricsLayoutOrientationToOrientationConverter" /> <converter:LyricsLayoutOrientationToOrientationConverter x:Key="LyricsLayoutOrientationToOrientationConverter" />
<converter:LyricsLayoutOrientationNegationToOrientationConverter x:Key="LyricsLayoutOrientationNegationToOrientationConverter" /> <converter:LyricsLayoutOrientationNegationToOrientationConverter x:Key="LyricsLayoutOrientationNegationToOrientationConverter" />
<converter:FileSourceTypeToIconConverter x:Key="FileSourceTypeToIconConverter" /> <converter:FileSourceTypeToIconConverter x:Key="FileSourceTypeToIconConverter" />
<converter:PathToImageConverter x:Key="PathToImageConverter" />
<converters:BoolToVisibilityConverter x:Key="BoolToVisibilityConverter" /> <converters:BoolToVisibilityConverter x:Key="BoolToVisibilityConverter" />
<converters:BoolNegationConverter x:Key="BoolNegationConverter" /> <converters:BoolNegationConverter x:Key="BoolNegationConverter" />
@@ -96,7 +97,7 @@
<Setter Property="VerticalAlignment" Value="Top" /> <Setter Property="VerticalAlignment" Value="Top" />
<Setter Property="CornerRadius" Value="4" /> <Setter Property="CornerRadius" Value="4" />
<Setter Property="BorderThickness" Value="0" /> <Setter Property="BorderThickness" Value="0" />
<Setter Property="Padding" Value="14,6,14,9" /> <Setter Property="Padding" Value="16,9,16,9" />
<Setter Property="Background" Value="Transparent" /> <Setter Property="Background" Value="Transparent" />
</Style> </Style>
<Style x:Key="GhostButtonStyle" TargetType="Button"> <Style x:Key="GhostButtonStyle" TargetType="Button">

View File

@@ -1,51 +1,56 @@
// 2025/6/23 by Zhe Fang using BetterLyrics.WinUI3.Helper;
using BetterLyrics.WinUI3.Helper;
using BetterLyrics.WinUI3.Hooks; using BetterLyrics.WinUI3.Hooks;
using BetterLyrics.WinUI3.Models.Settings; using BetterLyrics.WinUI3.Models.Db;
using BetterLyrics.WinUI3.Services.AlbumArtSearchService; using BetterLyrics.WinUI3.Services.AlbumArtSearchService;
using BetterLyrics.WinUI3.Services.DiscordService; using BetterLyrics.WinUI3.Services.DiscordService;
using BetterLyrics.WinUI3.Services.FileSystemService;
using BetterLyrics.WinUI3.Services.LastFMService; using BetterLyrics.WinUI3.Services.LastFMService;
using BetterLyrics.WinUI3.Services.LibWatcherService;
using BetterLyrics.WinUI3.Services.LocalizationService; using BetterLyrics.WinUI3.Services.LocalizationService;
using BetterLyrics.WinUI3.Services.LyricsSearchService; using BetterLyrics.WinUI3.Services.LyricsSearchService;
using BetterLyrics.WinUI3.Services.MediaSessionsService; using BetterLyrics.WinUI3.Services.MediaSessionsService;
using BetterLyrics.WinUI3.Services.PlayHistoryService;
using BetterLyrics.WinUI3.Services.SettingsService; using BetterLyrics.WinUI3.Services.SettingsService;
using BetterLyrics.WinUI3.Services.TranslationService; using BetterLyrics.WinUI3.Services.TranslationService;
using BetterLyrics.WinUI3.Services.TransliterationService; using BetterLyrics.WinUI3.Services.TransliterationService;
using BetterLyrics.WinUI3.ViewModels; using BetterLyrics.WinUI3.ViewModels;
using BetterLyrics.WinUI3.Views; using BetterLyrics.WinUI3.Views;
using CommunityToolkit.Mvvm.DependencyInjection; using CommunityToolkit.Mvvm.DependencyInjection;
using Microsoft.Data.Sqlite;
using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Logging; using Microsoft.Extensions.Logging;
using Microsoft.UI.Dispatching; // 关键:用于线程调度
using Microsoft.UI.Xaml; using Microsoft.UI.Xaml;
using Microsoft.Windows.ApplicationModel.Resources; using Microsoft.Windows.AppLifecycle; // 关键App生命周期管理
using Microsoft.Windows.Globalization;
using Serilog; using Serilog;
using System; using System;
using System.Globalization; using System.IO;
using System.Linq; using System.Linq;
using System.Text; using System.Text;
using System.Threading; using System.Threading;
using System.Threading.Tasks; using System.Threading.Tasks;
using Vanara.PInvoke;
namespace BetterLyrics.WinUI3 namespace BetterLyrics.WinUI3
{ {
public partial class App : Application public partial class App : Application
{ {
private Window? m_window;
private readonly ILogger<App> _logger; private readonly ILogger<App> _logger;
public static new App Current => (App)Application.Current; public static new App Current => (App)Application.Current;
private static Mutex? _instanceMutex; private readonly string _appKey = Windows.ApplicationModel.Package.Current.Id.FamilyName;
public App() public App()
{ {
this.InitializeComponent(); // Must be done before InitializeComponent
if (!TryHandleSingleInstance())
{
// 如果移交成功直接退出当前进程
Environment.Exit(0);
return;
}
EnsureSingleInstance(); this.InitializeComponent();
Encoding.RegisterProvider(CodePagesEncodingProvider.Instance); Encoding.RegisterProvider(CodePagesEncodingProvider.Instance);
PathHelper.EnsureDirectories(); PathHelper.EnsureDirectories();
@@ -53,29 +58,94 @@ namespace BetterLyrics.WinUI3
_logger = Ioc.Default.GetRequiredService<ILogger<App>>(); _logger = Ioc.Default.GetRequiredService<ILogger<App>>();
// 注册全局异常捕获
UnhandledException += App_UnhandledException; UnhandledException += App_UnhandledException;
AppDomain.CurrentDomain.UnhandledException += CurrentDomain_UnhandledException; AppDomain.CurrentDomain.UnhandledException += CurrentDomain_UnhandledException;
AppDomain.CurrentDomain.FirstChanceException += CurrentDomain_FirstChanceException; AppDomain.CurrentDomain.FirstChanceException += CurrentDomain_FirstChanceException;
TaskScheduler.UnobservedTaskException += TaskScheduler_UnobservedTaskException; TaskScheduler.UnobservedTaskException += TaskScheduler_UnobservedTaskException;
} }
private void EnsureSingleInstance() /// <summary>
/// 处理单实例逻辑。
/// 返回 true 表示我是主实例,继续运行。
/// 返回 false 表示我是第二个实例,已通知主实例,我应该退出。
/// </summary>
private bool TryHandleSingleInstance()
{ {
_instanceMutex = new Mutex(true, Constants.App.AppName, out bool createdNew); // 尝试查找或注册当前实例
var mainInstance = AppInstance.FindOrRegisterForKey(_appKey);
if (!createdNew) // 如果当前实例就是注册的那个主实例
if (mainInstance.IsCurrent)
{ {
User32.MessageBox(HWND.NULL, new ResourceLoader().GetString("TryRunMultipleInstance"), null, User32.MB_FLAGS.MB_APPLMODAL); // 监听 "Activated" 事件。
Environment.Exit(0); // 当第二个实例启动并重定向过来时,这个事件会被触发。
mainInstance.Activated += OnMainInstanceActivated;
return true;
}
else
{
// 我不是主实例,我是后来者。
// 获取当前实例的激活参数(比如是通过文件双击打开的,这里能拿到文件路径)
var args = AppInstance.GetCurrent().GetActivatedEventArgs();
// 将激活请求重定向给主实例
// 注意:这里是同步等待,确保发送成功后再退出
try
{
mainInstance.RedirectActivationToAsync(args).AsTask().Wait();
}
catch (Exception)
{
// 即使重定向失败,作为第二个实例也应该退出
}
return false;
} }
} }
protected override void OnLaunched(LaunchActivatedEventArgs args) /// <summary>
/// 当第二个实例试图启动时,主实例会收到此回调
/// </summary>
private void OnMainInstanceActivated(object? sender, AppActivationArguments e)
{ {
// 这个事件是在后台线程触发的,必须切回 UI 线程操作窗口
m_window?.DispatcherQueue.TryEnqueue(() =>
{
HandleActivation();
});
}
/// <summary>
/// 唤醒逻辑
/// </summary>
private void HandleActivation()
{
WindowHook.OpenOrShowWindow<LyricsWindowSwitchWindow>();
}
protected override async void OnLaunched(LaunchActivatedEventArgs args)
{
// 初始化数据库
await EnsureDatabasesAsync();
var settingsService = Ioc.Default.GetRequiredService<ISettingsService>(); var settingsService = Ioc.Default.GetRequiredService<ISettingsService>();
var fileSystemService = Ioc.Default.GetRequiredService<IFileSystemService>();
WindowHook.OpenOrShowWindow<SystemTrayWindow>(); // 开始后台扫描任务
foreach (var item in settingsService.AppSettings.LocalMediaFolders)
{
if (item.LastSyncTime == null)
{
_ = Task.Run(async () => await fileSystemService.ScanMediaFolderAsync(item, CancellationToken.None));
}
}
fileSystemService.StartAllFolderTimers();
// 初始化托盘
m_window = WindowHook.OpenOrShowWindow<SystemTrayWindow>();
// 根据设置打开歌词窗口
if (settingsService.AppSettings.GeneralSettings.AutoStartLyricsWindow) if (settingsService.AppSettings.GeneralSettings.AutoStartLyricsWindow)
{ {
var defaultStatus = settingsService.AppSettings.WindowBoundsRecords.Where(x => x.IsDefault); var defaultStatus = settingsService.AppSettings.WindowBoundsRecords.Where(x => x.IsDefault);
@@ -91,12 +161,101 @@ namespace BetterLyrics.WinUI3
} }
} }
} }
// 根据设置自动打开主界面
if (settingsService.AppSettings.MusicGallerySettings.AutoOpen) if (settingsService.AppSettings.MusicGallerySettings.AutoOpen)
{ {
WindowHook.OpenOrShowWindow<MusicGalleryWindow>(); WindowHook.OpenOrShowWindow<MusicGalleryWindow>();
} }
} }
private async Task EnsureDatabasesAsync()
{
var playHistoryFactory = Ioc.Default.GetRequiredService<IDbContextFactory<PlayHistoryDbContext>>();
var fileCacheFactory = Ioc.Default.GetRequiredService<IDbContextFactory<FilesIndexDbContext>>();
await SafeInitDatabaseAsync(
"PlayHistory",
PathHelper.PlayHistoryPath,
async () =>
{
using var db = await playHistoryFactory.CreateDbContextAsync();
await db.Database.EnsureCreatedAsync();
},
isCritical: true
);
await SafeInitDatabaseAsync(
"FileCache",
PathHelper.FilesIndexPath,
async () =>
{
using var db = await fileCacheFactory.CreateDbContextAsync();
await db.Database.EnsureCreatedAsync();
},
isCritical: false
);
}
private async Task SafeInitDatabaseAsync(string dbName, string dbPath, Func<Task> initAction, bool isCritical)
{
try
{
await initAction();
}
catch (Exception ex)
{
System.Diagnostics.Debug.WriteLine($"[DB Error] {dbName} init failed: {ex.Message}");
try
{
if (File.Exists(dbPath))
{
// 尝试清理连接池
SqliteConnection.ClearAllPools();
if (isCritical)
{
var backupPath = dbPath + ".bak_" + DateTime.Now.ToString("yyyyMMddHHmmss");
File.Move(dbPath, backupPath, true);
await ShowErrorDialogAsync("Database Recovery", $"Database {dbName} is damaged, the old database has been backed up to {backupPath}, and the program will create a new database.");
}
else
{
File.Delete(dbPath);
}
}
await initAction();
System.Diagnostics.Debug.WriteLine($"[DB Info] {dbName} recovered successfully.");
}
catch (Exception fatalEx)
{
System.Diagnostics.Debug.WriteLine($"[] : {fatalEx.Message}");
await ShowErrorDialogAsync("Fatal Error", $"{dbName} recovery failed, please delete the file at {dbPath} and try again by restarting the program. ({fatalEx.Message})");
}
}
}
private async Task ShowErrorDialogAsync(string title, string content)
{
// 这里假设 m_window 已经存在。如果没有显示主窗口,这个弹窗可能无法显示。
// 在 App 启动极早期的错误,可能需要退化为 Log 或者 System.Diagnostics.Process.Start 打开记事本报错
if (m_window != null)
{
m_window.DispatcherQueue.TryEnqueue(async () =>
{
var dialog = new Microsoft.UI.Xaml.Controls.ContentDialog
{
Title = title,
Content = content,
CloseButtonText = "OK",
XamlRoot = m_window.Content?.XamlRoot // 确保 Content 不为空
};
if (dialog.XamlRoot != null) await dialog.ShowAsync();
});
}
}
private static void ConfigureServices() private static void ConfigureServices()
{ {
Log.Logger = new LoggerConfiguration() Log.Logger = new LoggerConfiguration()
@@ -104,25 +263,32 @@ namespace BetterLyrics.WinUI3
.WriteTo.File(PathHelper.LogFilePattern, rollingInterval: RollingInterval.Day) .WriteTo.File(PathHelper.LogFilePattern, rollingInterval: RollingInterval.Day)
.CreateLogger(); .CreateLogger();
// Register services
Ioc.Default.ConfigureServices( Ioc.Default.ConfigureServices(
new ServiceCollection() new ServiceCollection()
// 数据库工厂
.AddDbContextFactory<PlayHistoryDbContext>(options => options.UseSqlite($"Data Source={PathHelper.PlayHistoryPath}"))
.AddDbContextFactory<FilesIndexDbContext>(options => options.UseSqlite($"Data Source={PathHelper.FilesIndexPath}"))
// 日志
.AddLogging(loggingBuilder => .AddLogging(loggingBuilder =>
{ {
loggingBuilder.ClearProviders(); loggingBuilder.ClearProviders();
loggingBuilder.AddSerilog(); loggingBuilder.AddSerilog();
}) })
// Services // Services
.AddSingleton<ISettingsService, SettingsService>() .AddSingleton<ISettingsService, SettingsService>()
.AddSingleton<IMediaSessionsService, MediaSessionsService>() .AddSingleton<IMediaSessionsService, MediaSessionsService>()
.AddSingleton<IAlbumArtSearchService, AlbumArtSearchService>() .AddSingleton<IAlbumArtSearchService, AlbumArtSearchService>()
.AddSingleton<ILyricsSearchService, LyricsSearchService>() .AddSingleton<ILyricsSearchService, LyricsSearchService>()
.AddSingleton<ILibWatcherService, LibWatcherService>()
.AddSingleton<ITranslationService, TranslationService>() .AddSingleton<ITranslationService, TranslationService>()
.AddSingleton<ITransliterationService, TransliterationService>() .AddSingleton<ITransliterationService, TransliterationService>()
.AddSingleton<ILastFMService, LastFMService>() .AddSingleton<ILastFMService, LastFMService>()
.AddSingleton<IDiscordService, DiscordService>() .AddSingleton<IDiscordService, DiscordService>()
.AddSingleton<ILocalizationService, LocalizationService>() .AddSingleton<ILocalizationService, LocalizationService>()
.AddSingleton<IFileSystemService, FileSystemService>()
.AddSingleton<IPlayHistoryService, PlayHistoryService>()
// ViewModels // ViewModels
.AddSingleton<AppSettingsControlViewModel>() .AddSingleton<AppSettingsControlViewModel>()
.AddSingleton<PlaybackSettingsControlViewModel>() .AddSingleton<PlaybackSettingsControlViewModel>()
@@ -137,6 +303,7 @@ namespace BetterLyrics.WinUI3
.AddSingleton<MusicGalleryPageViewModel>() .AddSingleton<MusicGalleryPageViewModel>()
.AddSingleton<AboutControlViewModel>() .AddSingleton<AboutControlViewModel>()
.AddSingleton<MusicGalleryWindowViewModel>() .AddSingleton<MusicGalleryWindowViewModel>()
.AddSingleton<StatsDashboardControlViewModel>()
.AddTransient<NowPlayingWindowViewModel>() .AddTransient<NowPlayingWindowViewModel>()
.AddTransient<NowPlayingPageViewModel>() .AddTransient<NowPlayingPageViewModel>()
@@ -154,7 +321,8 @@ namespace BetterLyrics.WinUI3
private void CurrentDomain_FirstChanceException(object? sender, System.Runtime.ExceptionServices.FirstChanceExceptionEventArgs e) private void CurrentDomain_FirstChanceException(object? sender, System.Runtime.ExceptionServices.FirstChanceExceptionEventArgs e)
{ {
_logger.LogError(e.Exception, "CurrentDomain_FirstChanceException"); // FirstChance 异常非常多(比如内部 try-catch 也会触发),通常建议只在 Debug 模式记录,或者过滤特定类型
// _logger.LogError(e.Exception, "CurrentDomain_FirstChanceException");
} }
private void CurrentDomain_UnhandledException(object sender, System.UnhandledExceptionEventArgs e) private void CurrentDomain_UnhandledException(object sender, System.UnhandledExceptionEventArgs e)
@@ -167,4 +335,4 @@ namespace BetterLyrics.WinUI3
_logger.LogError(e.Exception, "TaskScheduler_UnobservedTaskException"); _logger.LogError(e.Exception, "TaskScheduler_UnobservedTaskException");
} }
} }
} }

Binary file not shown.

After

Width:  |  Height:  |  Size: 17 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 59 KiB

View File

@@ -46,6 +46,7 @@
<None Remove="Controls\PropertyRow.xaml" /> <None Remove="Controls\PropertyRow.xaml" />
<None Remove="Controls\RemoteServerConfigControl.xaml" /> <None Remove="Controls\RemoteServerConfigControl.xaml" />
<None Remove="Controls\ShortcutTextBox.xaml" /> <None Remove="Controls\ShortcutTextBox.xaml" />
<None Remove="Controls\StatsDashboardControl.xaml" />
<None Remove="Controls\SystemTray.xaml" /> <None Remove="Controls\SystemTray.xaml" />
<None Remove="Controls\WindowSettingsControl.xaml" /> <None Remove="Controls\WindowSettingsControl.xaml" />
<None Remove="Views\LyricsSearchWindow.xaml" /> <None Remove="Views\LyricsSearchWindow.xaml" />
@@ -69,6 +70,7 @@
<PackageReference Include="CommunityToolkit.WinUI.Behaviors" Version="8.2.251219" /> <PackageReference Include="CommunityToolkit.WinUI.Behaviors" Version="8.2.251219" />
<PackageReference Include="CommunityToolkit.WinUI.Controls.Primitives" Version="8.2.251219" /> <PackageReference Include="CommunityToolkit.WinUI.Controls.Primitives" Version="8.2.251219" />
<PackageReference Include="CommunityToolkit.WinUI.Controls.Segmented" Version="8.2.251219" /> <PackageReference Include="CommunityToolkit.WinUI.Controls.Segmented" Version="8.2.251219" />
<PackageReference Include="CommunityToolkit.WinUI.Controls.Sizers" Version="8.2.251219" />
<PackageReference Include="CommunityToolkit.WinUI.Converters" Version="8.2.251219" /> <PackageReference Include="CommunityToolkit.WinUI.Converters" Version="8.2.251219" />
<PackageReference Include="CommunityToolkit.WinUI.Extensions" Version="8.2.251219" /> <PackageReference Include="CommunityToolkit.WinUI.Extensions" Version="8.2.251219" />
<PackageReference Include="CommunityToolkit.WinUI.Helpers" Version="8.2.251219" /> <PackageReference Include="CommunityToolkit.WinUI.Helpers" Version="8.2.251219" />
@@ -85,6 +87,11 @@
<PackageReference Include="Hqub.Last.fm" Version="2.5.1" /> <PackageReference Include="Hqub.Last.fm" Version="2.5.1" />
<PackageReference Include="Interop.UIAutomationClient" Version="10.19041.0" /> <PackageReference Include="Interop.UIAutomationClient" Version="10.19041.0" />
<PackageReference Include="Lyricify.Lyrics.Helper-NativeAot" Version="0.1.4-alpha.5" /> <PackageReference Include="Lyricify.Lyrics.Helper-NativeAot" Version="0.1.4-alpha.5" />
<PackageReference Include="Microsoft.Data.SqlClient" Version="6.1.3" />
<PackageReference Include="Microsoft.EntityFrameworkCore" Version="10.0.1" />
<PackageReference Include="Microsoft.EntityFrameworkCore.Abstractions" Version="10.0.1" />
<PackageReference Include="Microsoft.EntityFrameworkCore.Relational" Version="10.0.1" />
<PackageReference Include="Microsoft.EntityFrameworkCore.Sqlite" Version="10.0.1" />
<PackageReference Include="Microsoft.Extensions.DependencyInjection" Version="10.0.1" /> <PackageReference Include="Microsoft.Extensions.DependencyInjection" Version="10.0.1" />
<PackageReference Include="Microsoft.Extensions.Logging" Version="10.0.1" /> <PackageReference Include="Microsoft.Extensions.Logging" Version="10.0.1" />
<PackageReference Include="Microsoft.Graphics.Win2D" Version="1.3.2" /> <PackageReference Include="Microsoft.Graphics.Win2D" Version="1.3.2" />
@@ -127,6 +134,10 @@
<ItemGroup> <ItemGroup>
<TrimmerRootAssembly Include="FlaUI.UIA3" /> <TrimmerRootAssembly Include="FlaUI.UIA3" />
<TrimmerRootAssembly Include="Interop.UIAutomationClient" /> <TrimmerRootAssembly Include="Interop.UIAutomationClient" />
<TrimmerRootAssembly Include="Microsoft.EntityFrameworkCore" />
<TrimmerRootAssembly Include="Microsoft.EntityFrameworkCore.Abstractions" />
<TrimmerRootAssembly Include="Microsoft.EntityFrameworkCore.Relational" />
<TrimmerRootAssembly Include="Microsoft.EntityFrameworkCore.Sqlite" />
<TrimmerRootAssembly Include="NAudio.Wasapi" /> <TrimmerRootAssembly Include="NAudio.Wasapi" />
<TrimmerRootAssembly Include="TagLibSharp" /> <TrimmerRootAssembly Include="TagLibSharp" />
<TrimmerRootAssembly Include="Vanara.PInvoke.DwmApi" /> <TrimmerRootAssembly Include="Vanara.PInvoke.DwmApi" />
@@ -169,6 +180,9 @@
<Content Update="Assets\EmptyState.png"> <Content Update="Assets\EmptyState.png">
<CopyToOutputDirectory>Always</CopyToOutputDirectory> <CopyToOutputDirectory>Always</CopyToOutputDirectory>
</Content> </Content>
<Content Update="Assets\Folder.png">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</Content>
<Content Update="Assets\foobar2000.png"> <Content Update="Assets\foobar2000.png">
<CopyToOutputDirectory>Always</CopyToOutputDirectory> <CopyToOutputDirectory>Always</CopyToOutputDirectory>
</Content> </Content>
@@ -211,6 +225,9 @@
<Content Update="Assets\NetEaseCloudMusic.png"> <Content Update="Assets\NetEaseCloudMusic.png">
<CopyToOutputDirectory>Always</CopyToOutputDirectory> <CopyToOutputDirectory>Always</CopyToOutputDirectory>
</Content> </Content>
<Content Update="Assets\OriginalSoundHQPlayer.png">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</Content>
<Content Update="Assets\Page.png"> <Content Update="Assets\Page.png">
<CopyToOutputDirectory>Always</CopyToOutputDirectory> <CopyToOutputDirectory>Always</CopyToOutputDirectory>
</Content> </Content>
@@ -242,6 +259,11 @@
<CopyToOutputDirectory>Always</CopyToOutputDirectory> <CopyToOutputDirectory>Always</CopyToOutputDirectory>
</Content> </Content>
</ItemGroup> </ItemGroup>
<ItemGroup>
<Page Update="Controls\StatsDashboardControl.xaml">
<Generator>MSBuild:Compile</Generator>
</Page>
</ItemGroup>
<ItemGroup> <ItemGroup>
<Page Update="Controls\FontFamilyAutoSuggestBox.xaml"> <Page Update="Controls\FontFamilyAutoSuggestBox.xaml">
<Generator>MSBuild:Compile</Generator> <Generator>MSBuild:Compile</Generator>

View File

@@ -1,6 +1,6 @@
namespace BetterLyrics.WinUI3.Constants namespace BetterLyrics.WinUI3.Constants
{ {
public static class PlayerID public static class PlayerId
{ {
public const string LXMusic = "cn.toside.music.desktop"; public const string LXMusic = "cn.toside.music.desktop";
public const string LXMusicPortable = "lx-music-desktop.exe"; public const string LXMusicPortable = "lx-music-desktop.exe";
@@ -25,5 +25,6 @@
public const string MoeKoeMusic = "cn.MoeKoe.Music"; public const string MoeKoeMusic = "cn.MoeKoe.Music";
public const string MoeKoeMusicAlternative = "electron.app.MoeKoe Music"; public const string MoeKoeMusicAlternative = "electron.app.MoeKoe Music";
public const string Listen1 = "com.listen1.listen1"; public const string Listen1 = "com.listen1.listen1";
public const string OriginalSoundHQPlayer = "SennpaiStudio.528762A6196EF_z79ft30j24epr!App";
} }
} }

View File

@@ -24,5 +24,6 @@
public const string SaltPlayerForWindowsSteam = "Salt Player for Windows (Steam)"; public const string SaltPlayerForWindowsSteam = "Salt Player for Windows (Steam)";
public const string MoeKoeMusic = "MoeKoe Music"; public const string MoeKoeMusic = "MoeKoe Music";
public const string Listen1 = "Listen 1"; public const string Listen1 = "Listen 1";
public const string OriginalSoundHQPlayer = "Original Sound HQ Player";
} }
} }

View File

@@ -118,13 +118,21 @@
</HyperlinkButton> </HyperlinkButton>
<HyperlinkButton Content="爱发电" NavigateUri="{x:Bind const:Link.Afdian}" /> <HyperlinkButton Content="爱发电" NavigateUri="{x:Bind const:Link.Afdian}" />
</StackPanel> </StackPanel>
<StackPanel Orientation="Horizontal" Spacing="6"> <Grid ColumnSpacing="6">
<TextBlock Foreground="{ThemeResource TextFillColorSecondaryBrush}" Text="*" /> <Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto" />
<ColumnDefinition Width="*" />
</Grid.ColumnDefinitions>
<TextBlock
Grid.Column="0"
Foreground="{ThemeResource TextFillColorSecondaryBrush}"
Text="*" />
<TextBlock <TextBlock
x:Uid="SetingsPageThanks" x:Uid="SetingsPageThanks"
Grid.Column="1"
Foreground="{ThemeResource TextFillColorSecondaryBrush}" Foreground="{ThemeResource TextFillColorSecondaryBrush}"
TextWrapping="Wrap" /> TextWrapping="Wrap" />
</StackPanel> </Grid>
</StackPanel> </StackPanel>
</dev:SettingsCard> </dev:SettingsCard>
@@ -182,6 +190,12 @@
</dev:SettingsExpander.ItemsHeader> </dev:SettingsExpander.ItemsHeader>
</dev:SettingsExpander> </dev:SettingsExpander>
<dev:SettingsCard x:Uid="SettingsPageSettingsPlayHistory" Visibility="Collapsed">
<StackPanel Orientation="Horizontal" Spacing="6">
<Button x:Uid="SettingsPageExportPlayHistoryButton" Command="{x:Bind ViewModel.ExportPlayHistoryCommand}" />
</StackPanel>
</dev:SettingsCard>
<dev:SettingsCard x:Uid="SettingsPageFixedTimeStep" Visibility="Collapsed"> <dev:SettingsCard x:Uid="SettingsPageFixedTimeStep" Visibility="Collapsed">
<ToggleSwitch IsOn="{x:Bind ViewModel.AppSettings.AdvancedSettings.IsFixedTimeStep, Mode=TwoWay}" /> <ToggleSwitch IsOn="{x:Bind ViewModel.AppSettings.AdvancedSettings.IsFixedTimeStep, Mode=TwoWay}" />
</dev:SettingsCard> </dev:SettingsCard>

View File

@@ -42,7 +42,6 @@ namespace BetterLyrics.WinUI3.Controls
{ {
private readonly ISettingsService _settingsService = Ioc.Default.GetRequiredService<ISettingsService>(); private readonly ISettingsService _settingsService = Ioc.Default.GetRequiredService<ISettingsService>();
private readonly IMediaSessionsService _mediaSessionsService = Ioc.Default.GetRequiredService<IMediaSessionsService>(); private readonly IMediaSessionsService _mediaSessionsService = Ioc.Default.GetRequiredService<IMediaSessionsService>();
private readonly ILastFMService _lastFMService = Ioc.Default.GetRequiredService<ILastFMService>();
private readonly LyricsRenderer _lyricsRenderer = new(); private readonly LyricsRenderer _lyricsRenderer = new();
private readonly FluidBackgroundRenderer _fluidRenderer = new(); private readonly FluidBackgroundRenderer _fluidRenderer = new();
@@ -660,22 +659,6 @@ namespace BetterLyrics.WinUI3.Controls
_songPosition += elapsedTime; _songPosition += elapsedTime;
_totalPlayedTime += elapsedTime; _totalPlayedTime += elapsedTime;
_songPositionWithOffset = _songPosition + TimeSpan.FromMilliseconds(_mediaSessionsService.CurrentMediaSourceProviderInfo?.PositionOffset ?? 0); _songPositionWithOffset = _songPosition + TimeSpan.FromMilliseconds(_mediaSessionsService.CurrentMediaSourceProviderInfo?.PositionOffset ?? 0);
CheckAndScrobbleLastFM();
}
}
private void CheckAndScrobbleLastFM()
{
bool isEnabled = _mediaSessionsService.CurrentMediaSourceProviderInfo?.IsLastFMTrackEnabled ?? false;
if (!isEnabled || _isLastFMTracked) return;
var songInfo = _mediaSessionsService.CurrentSongInfo;
if (songInfo == null || songInfo.Duration <= 0) return;
if (_totalPlayedTime.TotalSeconds >= songInfo.Duration * 0.5)
{
_isLastFMTracked = true;
_lastFMService.TrackAsync(songInfo);
} }
} }

View File

@@ -25,7 +25,7 @@
<ColumnDefinition Width="*" /> <ColumnDefinition Width="*" />
</Grid.ColumnDefinitions> </Grid.ColumnDefinitions>
<Grid Grid.Column="0"> <Grid Grid.Column="0">
<ScrollViewer> <ScrollViewer Padding="8,0">
<StackPanel Spacing="{StaticResource SettingsCardSpacing}"> <StackPanel Spacing="{StaticResource SettingsCardSpacing}">
<TextBlock x:Uid="LyricsSearchControlSongInfoMapping" Style="{StaticResource SettingsSectionHeaderTextBlockStyle}" /> <TextBlock x:Uid="LyricsSearchControlSongInfoMapping" Style="{StaticResource SettingsSectionHeaderTextBlockStyle}" />
@@ -153,12 +153,11 @@
<CheckBox x:Uid="LyricsSearchControlMarkAsPureMusic" IsChecked="{x:Bind ViewModel.MappedSongSearchQuery.IsMarkedAsPureMusic, Mode=TwoWay}" /> <CheckBox x:Uid="LyricsSearchControlMarkAsPureMusic" IsChecked="{x:Bind ViewModel.MappedSongSearchQuery.IsMarkedAsPureMusic, Mode=TwoWay}" />
</dev:SettingsCard> </dev:SettingsCard>
<dev:SettingsCard x:Uid="LyricsSearchControlTargetSearchProvider"> <Button
<Button x:Uid="LyricsSearchControlSearch"
x:Uid="LyricsSearchControlSearch" HorizontalAlignment="Stretch"
Command="{x:Bind ViewModel.SearchCommand}" Command="{x:Bind ViewModel.SearchCommand}"
Style="{StaticResource AccentButtonStyle}" /> Style="{StaticResource AccentButtonStyle}" />
</dev:SettingsCard>
<dev:SettingsCard x:Uid="LyricsSearchControlIgnoreCache"> <dev:SettingsCard x:Uid="LyricsSearchControlIgnoreCache">
<ToggleSwitch IsOn="{x:Bind ViewModel.AppSettings.GeneralSettings.IgnoreCacheWhenSearching, Mode=TwoWay}" /> <ToggleSwitch IsOn="{x:Bind ViewModel.AppSettings.GeneralSettings.IgnoreCacheWhenSearching, Mode=TwoWay}" />
@@ -183,10 +182,7 @@
<local:PropertyRow x:Uid="SettingsPageSongTitle" Value="{x:Bind Title, TargetNullValue=N/A, Mode=OneWay}" /> <local:PropertyRow x:Uid="SettingsPageSongTitle" Value="{x:Bind Title, TargetNullValue=N/A, Mode=OneWay}" />
<local:PropertyRow x:Uid="SettingsPageArtist" Value="{x:Bind DisplayArtists, TargetNullValue=N/A, Mode=OneWay}" /> <local:PropertyRow x:Uid="SettingsPageArtist" Value="{x:Bind DisplayArtists, TargetNullValue=N/A, Mode=OneWay}" />
<local:PropertyRow x:Uid="SettingsPageAlbum" Value="{x:Bind Album, TargetNullValue=N/A, Mode=OneWay}" /> <local:PropertyRow x:Uid="SettingsPageAlbum" Value="{x:Bind Album, TargetNullValue=N/A, Mode=OneWay}" />
<local:PropertyRow <local:PropertyRow x:Uid="LyricsSearchControlDurauion" Value="{x:Bind Duration, Converter={StaticResource SecondsToFormattedTimeConverter}, TargetNullValue=N/A, Mode=OneWay}" />
x:Uid="LyricsSearchControlDurauion"
Unit="s"
Value="{x:Bind Duration, TargetNullValue=N/A, Mode=OneWay}" />
<local:PropertyRow <local:PropertyRow
x:Uid="LyricsPageMatchPercentage" x:Uid="LyricsPageMatchPercentage"
Unit="%" Unit="%"
@@ -244,8 +240,6 @@
<ProgressBar <ProgressBar
VerticalAlignment="Top" VerticalAlignment="Top"
IsIndeterminate="True" IsIndeterminate="True"
ShowError="False"
ShowPaused="False"
Visibility="{x:Bind ViewModel.IsSearching, Converter={StaticResource BoolToVisibilityConverter}, Mode=OneWay}" /> Visibility="{x:Bind ViewModel.IsSearching, Converter={StaticResource BoolToVisibilityConverter}, Mode=OneWay}" />
</Grid> </Grid>
<Grid Grid.Column="2"> <Grid Grid.Column="2">
@@ -346,8 +340,8 @@
</Grid> </Grid>
<Grid Grid.Row="1" ColumnSpacing="6"> <Grid Grid.Row="1" ColumnSpacing="6">
<Grid.ColumnDefinitions> <Grid.ColumnDefinitions>
<ColumnDefinition Width="*" />
<ColumnDefinition Width="Auto" /> <ColumnDefinition Width="Auto" />
<ColumnDefinition Width="*" />
<ColumnDefinition Width="Auto" /> <ColumnDefinition Width="Auto" />
<ColumnDefinition Width="Auto" /> <ColumnDefinition Width="Auto" />
</Grid.ColumnDefinitions> </Grid.ColumnDefinitions>

View File

@@ -187,29 +187,51 @@
<controls:Segmented <controls:Segmented
x:Name="ConfigSegmented" x:Name="ConfigSegmented"
HorizontalAlignment="Stretch"
SelectionChanged="ConfigSegmented_SelectionChanged" SelectionChanged="ConfigSegmented_SelectionChanged"
Style="{StaticResource PivotSegmentedStyle}"> Style="{StaticResource PivotSegmentedStyle}">
<controls:SegmentedItem x:Name="WindowSegmentedItem" Tag="Window"> <controls:SegmentedItem x:Name="WindowSegmentedItem" Tag="Window">
<TextBlock x:Uid="AppSettingsControlGeneral" /> <TextBlock
x:Uid="AppSettingsControlGeneral"
MaxWidth="120"
TextWrapping="Wrap" />
</controls:SegmentedItem> </controls:SegmentedItem>
<controls:SegmentedItem x:Name="LayoutSegmentedItem" Tag="Layout"> <controls:SegmentedItem x:Name="LayoutSegmentedItem" Tag="Layout">
<TextBlock x:Uid="SettingsPageLayout" /> <TextBlock
x:Uid="SettingsPageLayout"
MaxWidth="120"
TextWrapping="Wrap" />
</controls:SegmentedItem> </controls:SegmentedItem>
<controls:SegmentedItem x:Name="AlbumArtStyleSegmentedItem" Tag="AlbumArtStyle"> <controls:SegmentedItem x:Name="AlbumArtStyleSegmentedItem" Tag="AlbumArtStyle">
<TextBlock x:Uid="SettingsPageAlbumStyle" /> <TextBlock
x:Uid="SettingsPageAlbumStyle"
MaxWidth="120"
TextWrapping="Wrap" />
</controls:SegmentedItem> </controls:SegmentedItem>
<controls:SegmentedItem Tag="AlbumArtEffect"> <controls:SegmentedItem Tag="AlbumArtEffect">
<TextBlock x:Uid="SettingsPageAlbumEffect" /> <TextBlock
x:Uid="SettingsPageAlbumEffect"
MaxWidth="120"
TextWrapping="Wrap" />
</controls:SegmentedItem> </controls:SegmentedItem>
<controls:SegmentedItem Tag="LyricsStyle"> <controls:SegmentedItem Tag="LyricsStyle">
<TextBlock x:Uid="SettingsPageLyricsStyle" /> <TextBlock
x:Uid="SettingsPageLyricsStyle"
MaxWidth="120"
TextWrapping="Wrap" />
</controls:SegmentedItem> </controls:SegmentedItem>
<controls:SegmentedItem Tag="LyricsEffect"> <controls:SegmentedItem Tag="LyricsEffect">
<TextBlock x:Uid="SettingsPageLyricsEffect" /> <TextBlock
x:Uid="SettingsPageLyricsEffect"
MaxWidth="120"
TextWrapping="Wrap" />
</controls:SegmentedItem> </controls:SegmentedItem>
<controls:SegmentedItem Tag="LyricsBackground"> <controls:SegmentedItem Tag="LyricsBackground">
<TextBlock x:Uid="SettingsPageBackgroundOverlay" /> <TextBlock
x:Uid="SettingsPageBackgroundOverlay"
MaxWidth="120"
TextWrapping="Wrap" />
</controls:SegmentedItem> </controls:SegmentedItem>
</controls:Segmented> </controls:Segmented>

View File

@@ -5,6 +5,7 @@
xmlns:controls="using:CommunityToolkit.WinUI.Controls" xmlns:controls="using:CommunityToolkit.WinUI.Controls"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:dev="using:DevWinUI" xmlns:dev="using:DevWinUI"
xmlns:enums="using:BetterLyrics.WinUI3.Enums"
xmlns:interactivity="using:Microsoft.Xaml.Interactivity" xmlns:interactivity="using:Microsoft.Xaml.Interactivity"
xmlns:local="using:BetterLyrics.WinUI3.Controls" xmlns:local="using:BetterLyrics.WinUI3.Controls"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
@@ -50,37 +51,74 @@
SelectionMode="None"> SelectionMode="None">
<ListView.ItemTemplate> <ListView.ItemTemplate>
<DataTemplate x:DataType="models:MediaFolder"> <DataTemplate x:DataType="models:MediaFolder">
<dev:SettingsExpander Description="{x:Bind ConnectionSummary, Mode=OneWay}"> <dev:SettingsExpander IsExpanded="True">
<dev:SettingsExpander.HeaderIcon> <dev:SettingsExpander.HeaderIcon>
<FontIcon FontFamily="{StaticResource IconFontFamily}" Glyph="{x:Bind SourceType, Converter={StaticResource FileSourceTypeToIconConverter}, Mode=OneWay}" /> <FontIcon FontFamily="{StaticResource IconFontFamily}" Glyph="{x:Bind SourceType, Converter={StaticResource FileSourceTypeToIconConverter}, Mode=OneWay}" />
</dev:SettingsExpander.HeaderIcon> </dev:SettingsExpander.HeaderIcon>
<dev:SettingsExpander.Header> <dev:SettingsExpander.Header>
<HyperlinkButton <TextBlock IsTextSelectionEnabled="True" Text="{x:Bind Name, Mode=OneWay}" />
Padding="0"
Click="LocalFolderHyperlinkButton_Click"
Content="{x:Bind Path, Mode=OneWay}"
Tag="{x:Bind Path, Mode=OneWay}"
ToolTipService.ToolTip="{x:Bind ConnectionSummary}" />
</dev:SettingsExpander.Header> </dev:SettingsExpander.Header>
<dev:SettingsExpander.Description>
<TextBlock IsTextSelectionEnabled="True" Text="{x:Bind ConnectionSummary, Mode=OneWay}" />
</dev:SettingsExpander.Description>
<ToggleSwitch IsOn="{x:Bind IsEnabled, Mode=TwoWay}" /> <ToggleSwitch IsOn="{x:Bind IsEnabled, Mode=TwoWay}" />
<dev:SettingsExpander.Items> <dev:SettingsExpander.Items>
<dev:SettingsCard> <dev:SettingsCard x:Uid="MediaSettingsControlNameSetting">
<dev:SettingsCard.Header> <TextBox VerticalAlignment="Center" Text="{x:Bind Name, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" />
<HyperlinkButton
x:Uid="SettingsPageRemovePath"
Padding="0"
Click="SettingsPageRemovePathButton_Click"
Tag="{Binding}" />
</dev:SettingsCard.Header>
</dev:SettingsCard> </dev:SettingsCard>
<dev:SettingsCard x:Uid="MediaSettingsControlLastSyncTime" Description="{x:Bind LastSyncTime.ToString(), Mode=OneWay, TargetNullValue=N/A}">
<dev:SettingsCard x:Uid="SettingsPageMusicLibRealTimeWatch" IsEnabled="{Binding IsLocal, Mode=OneWay}"> <Button
<ToggleSwitch IsOn="{Binding IsRealTimeWatchEnabled, Mode=TwoWay}" /> x:Uid="MediaSettingsControlSyncNow"
Click="SyncNowButton_Click"
IsEnabled="{x:Bind IsEnabled, Mode=OneWay}" />
</dev:SettingsCard>
<dev:SettingsCard x:Uid="MusicSettingsControlAutoSyncInterval">
<ComboBox IsEnabled="{x:Bind IsEnabled, Mode=OneWay}" SelectedIndex="{x:Bind ScanInterval, Mode=TwoWay, Converter={StaticResource EnumToIntConverter}}">
<ComboBoxItem x:Uid="MusicSettingsControlAutoSyncIntervalDisabled" />
<ComboBoxItem x:Uid="MusicSettingsControlAutoSyncIntervalEveryFifteenMin" />
<ComboBoxItem x:Uid="MusicSettingsControlAutoSyncIntervalEveryHour" />
<ComboBoxItem x:Uid="MusicSettingsControlAutoSyncIntervalEverySixHrs" />
<ComboBoxItem x:Uid="MusicSettingsControlAutoSyncIntervalEveryDay" />
</ComboBox>
</dev:SettingsCard>
<dev:SettingsCard>
<Button x:Uid="SettingsPageRemovePath" Click="SettingsPageRemovePathButton_Click" />
</dev:SettingsCard> </dev:SettingsCard>
</dev:SettingsExpander.Items> </dev:SettingsExpander.Items>
<dev:SettingsExpander.ItemsHeader>
<StackPanel>
<!-- Index info -->
<InfoBar
IsClosable="False"
IsOpen="True"
Message="{x:Bind StatusText, Mode=OneWay}"
Severity="{x:Bind StatusSeverity, Mode=OneWay}" />
<ProgressBar
Background="Transparent"
Visibility="{x:Bind IsProcessing, Mode=OneWay, Converter={StaticResource BoolToVisibilityConverter}}"
Value="{x:Bind IndexingProgress, Mode=OneWay}">
<interactivity:Interaction.Behaviors>
<interactivity:DataTriggerBehavior
Binding="{x:Bind IndexingProgress, Mode=OneWay}"
ComparisonCondition="Equal"
Value="0">
<interactivity:ChangePropertyAction PropertyName="IsIndeterminate" Value="True" />
</interactivity:DataTriggerBehavior>
<interactivity:DataTriggerBehavior
Binding="{x:Bind IndexingProgress, Mode=OneWay}"
ComparisonCondition="NotEqual"
Value="0">
<interactivity:ChangePropertyAction PropertyName="IsIndeterminate" Value="False" />
</interactivity:DataTriggerBehavior>
</interactivity:Interaction.Behaviors>
</ProgressBar>
</StackPanel>
</dev:SettingsExpander.ItemsHeader>
</dev:SettingsExpander> </dev:SettingsExpander>
</DataTemplate> </DataTemplate>
</ListView.ItemTemplate> </ListView.ItemTemplate>
@@ -92,37 +130,37 @@
<MenuFlyout> <MenuFlyout>
<MenuFlyoutItem <MenuFlyoutItem
x:Uid="SettingsPageLocalFolder" x:Uid="SettingsPageLocalFolder"
Command="{x:Bind ViewModel.SelectAndAddFolderCommand}" Command="{x:Bind ViewModel.AddMediaSourceCommand}"
CommandParameter="{Binding ElementName=RootGrid}" CommandParameter="Local">
Icon="Folder" /> <MenuFlyoutItem.Icon>
<FontIcon FontFamily="{StaticResource IconFontFamily}" Glyph="&#xE8B7;" />
</MenuFlyoutItem.Icon>
</MenuFlyoutItem>
<MenuFlyoutSeparator Visibility="Collapsed" /> <MenuFlyoutSeparator />
<MenuFlyoutItem <MenuFlyoutItem
Command="{x:Bind ViewModel.AddRemoteSourceCommand}" Command="{x:Bind ViewModel.AddMediaSourceCommand}"
CommandParameter="SMB" CommandParameter="SMB"
Text="SMB" Text="SMB">
Visibility="Collapsed">
<MenuFlyoutItem.Icon> <MenuFlyoutItem.Icon>
<FontIcon FontFamily="{StaticResource IconFontFamily}" Glyph="&#xE839;" /> <FontIcon FontFamily="{StaticResource IconFontFamily}" Glyph="&#xE839;" />
</MenuFlyoutItem.Icon> </MenuFlyoutItem.Icon>
</MenuFlyoutItem> </MenuFlyoutItem>
<MenuFlyoutItem <MenuFlyoutItem
Command="{x:Bind ViewModel.AddRemoteSourceCommand}" Command="{x:Bind ViewModel.AddMediaSourceCommand}"
CommandParameter="FTP" CommandParameter="FTP"
Text="FTP" Text="FTP">
Visibility="Collapsed">
<MenuFlyoutItem.Icon> <MenuFlyoutItem.Icon>
<FontIcon FontFamily="{StaticResource IconFontFamily}" Glyph="&#xE838;" /> <FontIcon FontFamily="{StaticResource IconFontFamily}" Glyph="&#xE838;" />
</MenuFlyoutItem.Icon> </MenuFlyoutItem.Icon>
</MenuFlyoutItem> </MenuFlyoutItem>
<MenuFlyoutItem <MenuFlyoutItem
Command="{x:Bind ViewModel.AddRemoteSourceCommand}" Command="{x:Bind ViewModel.AddMediaSourceCommand}"
CommandParameter="WebDAV" CommandParameter="WebDAV"
Text="WebDAV" Text="WebDAV">
Visibility="Collapsed">
<MenuFlyoutItem.Icon> <MenuFlyoutItem.Icon>
<FontIcon FontFamily="{StaticResource IconFontFamily}" Glyph="&#xE774;" /> <FontIcon FontFamily="{StaticResource IconFontFamily}" Glyph="&#xE774;" />
</MenuFlyoutItem.Icon> </MenuFlyoutItem.Icon>

View File

@@ -4,6 +4,7 @@ using CommunityToolkit.Mvvm.DependencyInjection;
using Microsoft.UI.Xaml; using Microsoft.UI.Xaml;
using Microsoft.UI.Xaml.Controls; using Microsoft.UI.Xaml.Controls;
using System; using System;
using System.Threading.Tasks;
using Windows.System; using Windows.System;
// To learn more about WinUI, the WinUI project structure, // To learn more about WinUI, the WinUI project structure,
@@ -22,18 +23,14 @@ namespace BetterLyrics.WinUI3.Controls
private void SettingsPageRemovePathButton_Click(object sender, Microsoft.UI.Xaml.RoutedEventArgs e) private void SettingsPageRemovePathButton_Click(object sender, Microsoft.UI.Xaml.RoutedEventArgs e)
{ {
ViewModel.RemoveFolderAsync((MediaFolder)(sender as HyperlinkButton)!.Tag); var folder = (MediaFolder)((FrameworkElement)sender).DataContext;
ViewModel.RemoveFolder(folder);
} }
private async void LocalFolderHyperlinkButton_Click(object sender, RoutedEventArgs e) private void SyncNowButton_Click(object sender, RoutedEventArgs e)
{ {
if (sender is HyperlinkButton button && button.Tag is string uriStr) var folder = (MediaFolder)((FrameworkElement)sender).DataContext;
{ ViewModel.SyncFolder(folder);
if (Uri.TryCreate(uriStr, UriKind.Absolute, out var uri))
{
await Launcher.LaunchUriAsync(uri);
}
}
} }
} }
} }

View File

@@ -11,7 +11,6 @@
mc:Ignorable="d"> mc:Ignorable="d">
<Grid x:Name="RootGrid"> <Grid x:Name="RootGrid">
<Grid <Grid
x:Name="BottomCommandGrid" x:Name="BottomCommandGrid"
Background="{ThemeResource LayerOnMicaBaseAltFillColorDefaultBrush}" Background="{ThemeResource LayerOnMicaBaseAltFillColorDefaultBrush}"
@@ -113,7 +112,58 @@
x:Name="BottomCenterCommandStackPanel" x:Name="BottomCenterCommandStackPanel"
Padding="16" Padding="16"
Orientation="Horizontal" Orientation="Horizontal"
Spacing="3"> Spacing="12">
<!-- Playback order -->
<Button
Grid.Column="2"
Click="PlaybackOrderButton_Click"
Style="{StaticResource GhostButtonStyle}"
Visibility="{x:Bind ShowPlaybackOrderButton, Mode=OneWay, Converter={StaticResource BoolToVisibilityConverter}}">
<ToolTipService.ToolTip>
<ToolTip>
<Grid>
<TextBlock x:Name="PlaybackRepeatAllHint" x:Uid="MusicGalleryPageQueueLoop" />
<TextBlock x:Name="PlaybackRepeatOneHint" x:Uid="MusicGalleryPageSingleLoop" />
<TextBlock x:Name="PlaybackShuffleHint" x:Uid="MusicGalleryPageQueueRandom" />
</Grid>
</ToolTip>
</ToolTipService.ToolTip>
<Button.Content>
<Grid>
<!-- Repeat all -->
<FontIcon
x:Name="PlaybackRepeatAll"
FontFamily="{StaticResource IconFontFamily}"
FontSize="16"
Glyph="&#xE8EE;">
<FontIcon.OpacityTransition>
<ScalarTransition />
</FontIcon.OpacityTransition>
</FontIcon>
<!-- Repeat one -->
<FontIcon
x:Name="PlaybackRepeatOne"
FontFamily="{StaticResource IconFontFamily}"
FontSize="16"
Glyph="&#xE8ED;">
<FontIcon.OpacityTransition>
<ScalarTransition />
</FontIcon.OpacityTransition>
</FontIcon>
<!-- Shuffle -->
<FontIcon
x:Name="PlaybackShuffle"
FontFamily="{StaticResource IconFontFamily}"
FontSize="16"
Glyph="&#xE8B1;">
<FontIcon.OpacityTransition>
<ScalarTransition />
</FontIcon.OpacityTransition>
</FontIcon>
</Grid>
</Button.Content>
</Button>
<!-- 上一曲目 -->
<Button <Button
Command="{x:Bind ViewModel.PreviousSongCommand}" Command="{x:Bind ViewModel.PreviousSongCommand}"
Content="{ui:FontIcon FontFamily={StaticResource IconFontFamily}, Content="{ui:FontIcon FontFamily={StaticResource IconFontFamily},
@@ -164,6 +214,13 @@
Content="{ui:FontIcon FontFamily={StaticResource IconFontFamily}, Content="{ui:FontIcon FontFamily={StaticResource IconFontFamily},
Glyph=&#xE623;}" Glyph=&#xE623;}"
Style="{StaticResource GhostButtonStyle}" /> Style="{StaticResource GhostButtonStyle}" />
<!-- 播放队列按钮 -->
<ToggleButton
Click="PlayingQueueButton_Click"
Content="{ui:FontIcon FontFamily={StaticResource IconFontFamily},
Glyph=&#xE8FD;}"
Style="{StaticResource GhostToggleButtonStyle}"
Visibility="{x:Bind ShowPlayingQueueButton, Converter={StaticResource BoolToVisibilityConverter}, Mode=OneWay}" />
</StackPanel> </StackPanel>
</Grid> </Grid>
@@ -427,7 +484,58 @@
</Grid.ContextFlyout> </Grid.ContextFlyout>
</Grid> </Grid>
<VisualStateManager.VisualStateGroups>
<VisualStateGroup x:Name="PlaybackOrderState">
<VisualState x:Name="RepeatAll">
<VisualState.StateTriggers>
<ui:CompareStateTrigger
Comparison="Equal"
Value="{x:Bind PlaybackOrder, Mode=OneWay, Converter={StaticResource EnumToIntConverter}}"
To="0" />
</VisualState.StateTriggers>
<VisualState.Setters>
<Setter Target="PlaybackRepeatAll.Opacity" Value="1" />
<Setter Target="PlaybackRepeatOne.Opacity" Value="0" />
<Setter Target="PlaybackShuffle.Opacity" Value="0" />
<Setter Target="PlaybackRepeatAllHint.Visibility" Value="Visible" />
<Setter Target="PlaybackRepeatOneHint.Visibility" Value="Collapsed" />
<Setter Target="PlaybackShuffleHint.Visibility" Value="Collapsed" />
</VisualState.Setters>
</VisualState>
<VisualState x:Name="RepeatOne">
<VisualState.StateTriggers>
<ui:CompareStateTrigger
Comparison="Equal"
Value="{x:Bind PlaybackOrder, Mode=OneWay, Converter={StaticResource EnumToIntConverter}}"
To="1" />
</VisualState.StateTriggers>
<VisualState.Setters>
<Setter Target="PlaybackRepeatAll.Opacity" Value="0" />
<Setter Target="PlaybackRepeatOne.Opacity" Value="1" />
<Setter Target="PlaybackShuffle.Opacity" Value="0" />
<Setter Target="PlaybackRepeatAllHint.Visibility" Value="Collapsed" />
<Setter Target="PlaybackRepeatOneHint.Visibility" Value="Visible" />
<Setter Target="PlaybackShuffleHint.Visibility" Value="Collapsed" />
</VisualState.Setters>
</VisualState>
<VisualState x:Name="Shuffle">
<VisualState.StateTriggers>
<ui:CompareStateTrigger
Comparison="Equal"
Value="{x:Bind PlaybackOrder, Mode=OneWay, Converter={StaticResource EnumToIntConverter}}"
To="2" />
</VisualState.StateTriggers>
<VisualState.Setters>
<Setter Target="PlaybackRepeatAll.Opacity" Value="0" />
<Setter Target="PlaybackRepeatOne.Opacity" Value="0" />
<Setter Target="PlaybackShuffle.Opacity" Value="1" />
<Setter Target="PlaybackRepeatAllHint.Visibility" Value="Collapsed" />
<Setter Target="PlaybackRepeatOneHint.Visibility" Value="Collapsed" />
<Setter Target="PlaybackShuffleHint.Visibility" Value="Visible" />
</VisualState.Setters>
</VisualState>
</VisualStateGroup>
</VisualStateManager.VisualStateGroups>
</Grid> </Grid>
</UserControl> </UserControl>

View File

@@ -1,5 +1,7 @@
using BetterLyrics.WinUI3.Enums;
using BetterLyrics.WinUI3.Hooks; using BetterLyrics.WinUI3.Hooks;
using BetterLyrics.WinUI3.Models; using BetterLyrics.WinUI3.Models;
using BetterLyrics.WinUI3.Models.Settings;
using BetterLyrics.WinUI3.Services.MediaSessionsService; using BetterLyrics.WinUI3.Services.MediaSessionsService;
using BetterLyrics.WinUI3.ViewModels; using BetterLyrics.WinUI3.ViewModels;
using BetterLyrics.WinUI3.Views; using BetterLyrics.WinUI3.Views;
@@ -12,6 +14,7 @@ using Microsoft.UI.Xaml.Input;
using Microsoft.UI.Xaml.Media.Imaging; using Microsoft.UI.Xaml.Media.Imaging;
using System; using System;
using System.Numerics; using System.Numerics;
using BetterLyrics.WinUI3.Extensions;
// To learn more about WinUI, the WinUI project structure, // To learn more about WinUI, the WinUI project structure,
// and more about our project templates, see: http://aka.ms/winui-project-info. // and more about our project templates, see: http://aka.ms/winui-project-info.
@@ -46,6 +49,42 @@ public sealed partial class NowPlayingBar : UserControl,
public static readonly DependencyProperty ShowSongInfoProperty = public static readonly DependencyProperty ShowSongInfoProperty =
DependencyProperty.Register(nameof(ShowSongInfo), typeof(bool), typeof(NowPlayingBar), new PropertyMetadata(false)); DependencyProperty.Register(nameof(ShowSongInfo), typeof(bool), typeof(NowPlayingBar), new PropertyMetadata(false));
public bool ShowPlayingQueueButton
{
get { return (bool)GetValue(ShowPlayingQueueButtonProperty); }
set { SetValue(ShowPlayingQueueButtonProperty, value); }
}
public static readonly DependencyProperty ShowPlayingQueueButtonProperty =
DependencyProperty.Register(nameof(ShowPlayingQueueButton), typeof(bool), typeof(NowPlayingBar), new PropertyMetadata(false));
public bool ShowPlaybackOrderButton
{
get { return (bool)GetValue(ShowPlaybackOrderButtonProperty); }
set { SetValue(ShowPlaybackOrderButtonProperty, value); }
}
public static readonly DependencyProperty ShowPlaybackOrderButtonProperty =
DependencyProperty.Register(nameof(ShowPlaybackOrderButton), typeof(bool), typeof(NowPlayingBar), new PropertyMetadata(false));
public PlaybackOrder PlaybackOrder
{
get { return (PlaybackOrder)GetValue(PlaybackOrderProperty); }
set { SetValue(PlaybackOrderProperty, value); }
}
public static readonly DependencyProperty PlaybackOrderProperty =
DependencyProperty.Register(nameof(PlaybackOrder), typeof(PlaybackOrder), typeof(NowPlayingBar), new PropertyMetadata(PlaybackOrder.RepeatAll));
public bool IsPlayingQueueOpened
{
get { return (bool)GetValue(IsPlayingQueueOpenedProperty); }
set { SetValue(IsPlayingQueueOpenedProperty, value); }
}
public static readonly DependencyProperty IsPlayingQueueOpenedProperty =
DependencyProperty.Register(nameof(IsPlayingQueueOpened), typeof(bool), typeof(NowPlayingBar), new PropertyMetadata(false));
public bool IsCompactMode public bool IsCompactMode
{ {
get { return (bool)GetValue(IsCompactModeProperty); } get { return (bool)GetValue(IsCompactModeProperty); }
@@ -210,12 +249,12 @@ public sealed partial class NowPlayingBar : UserControl,
private void SongInfoStackPanel_Tapped(object sender, TappedRoutedEventArgs e) private void SongInfoStackPanel_Tapped(object sender, TappedRoutedEventArgs e)
{ {
SongInfoTapped?.Invoke(this, EventArgs.Empty); SongInfoTapped?.Invoke(sender, EventArgs.Empty);
} }
private void TimeStackPanel_Tapped(object sender, TappedRoutedEventArgs e) private void TimeStackPanel_Tapped(object sender, TappedRoutedEventArgs e)
{ {
TimeTapped?.Invoke(this, EventArgs.Empty); TimeTapped?.Invoke(sender, EventArgs.Empty);
} }
private void BottomCommandGrid_PointerEntered(object sender, Microsoft.UI.Xaml.Input.PointerRoutedEventArgs e) private void BottomCommandGrid_PointerEntered(object sender, Microsoft.UI.Xaml.Input.PointerRoutedEventArgs e)
@@ -262,6 +301,16 @@ public sealed partial class NowPlayingBar : UserControl,
} }
} }
private void PlayingQueueButton_Click(object sender, RoutedEventArgs e)
{
IsPlayingQueueOpened = !IsPlayingQueueOpened;
}
private void PlaybackOrderButton_Click(object sender, RoutedEventArgs e)
{
PlaybackOrder = PlaybackOrder.GetNext();
}
public void Receive(PropertyChangedMessage<SongInfo?> message) public void Receive(PropertyChangedMessage<SongInfo?> message)
{ {
if (message.Sender is IMediaSessionsService) if (message.Sender is IMediaSessionsService)

View File

@@ -328,10 +328,7 @@
<local:PropertyRow x:Uid="SettingsPageSongTitle" Value="{x:Bind ViewModel.MediaSessionsService.CurrentSongInfo.Title, TargetNullValue=N/A, Mode=OneWay}" /> <local:PropertyRow x:Uid="SettingsPageSongTitle" Value="{x:Bind ViewModel.MediaSessionsService.CurrentSongInfo.Title, TargetNullValue=N/A, Mode=OneWay}" />
<local:PropertyRow x:Uid="SettingsPageArtist" Value="{x:Bind ViewModel.MediaSessionsService.CurrentSongInfo.DisplayArtists, TargetNullValue=N/A, Mode=OneWay}" /> <local:PropertyRow x:Uid="SettingsPageArtist" Value="{x:Bind ViewModel.MediaSessionsService.CurrentSongInfo.DisplayArtists, TargetNullValue=N/A, Mode=OneWay}" />
<local:PropertyRow x:Uid="SettingsPageAlbum" Value="{x:Bind ViewModel.MediaSessionsService.CurrentSongInfo.Album, TargetNullValue=N/A, Mode=OneWay}" /> <local:PropertyRow x:Uid="SettingsPageAlbum" Value="{x:Bind ViewModel.MediaSessionsService.CurrentSongInfo.Album, TargetNullValue=N/A, Mode=OneWay}" />
<local:PropertyRow <local:PropertyRow x:Uid="LyricsSearchControlDurauion" Value="{x:Bind ViewModel.MediaSessionsService.CurrentSongInfo.DurationMs, TargetNullValue=N/A, Converter={StaticResource MillisecondsToFormattedTimeConverter}, Mode=OneWay}" />
x:Uid="LyricsSearchControlDurauion"
Unit="s"
Value="{x:Bind ViewModel.MediaSessionsService.CurrentSongInfo.Duration, TargetNullValue=N/A, Mode=OneWay}" />
</StackPanel> </StackPanel>
</Expander> </Expander>
@@ -344,10 +341,7 @@
<local:PropertyRow x:Uid="SettingsPageSongTitle" Value="{x:Bind ViewModel.MediaSessionsService.CurrentLyricsSearchResult.Title, TargetNullValue=N/A, Mode=OneWay}" /> <local:PropertyRow x:Uid="SettingsPageSongTitle" Value="{x:Bind ViewModel.MediaSessionsService.CurrentLyricsSearchResult.Title, TargetNullValue=N/A, Mode=OneWay}" />
<local:PropertyRow x:Uid="SettingsPageArtist" Value="{x:Bind ViewModel.MediaSessionsService.CurrentLyricsSearchResult.DisplayArtists, TargetNullValue=N/A, Mode=OneWay}" /> <local:PropertyRow x:Uid="SettingsPageArtist" Value="{x:Bind ViewModel.MediaSessionsService.CurrentLyricsSearchResult.DisplayArtists, TargetNullValue=N/A, Mode=OneWay}" />
<local:PropertyRow x:Uid="SettingsPageAlbum" Value="{x:Bind ViewModel.MediaSessionsService.CurrentLyricsSearchResult.Album, TargetNullValue=N/A, Mode=OneWay}" /> <local:PropertyRow x:Uid="SettingsPageAlbum" Value="{x:Bind ViewModel.MediaSessionsService.CurrentLyricsSearchResult.Album, TargetNullValue=N/A, Mode=OneWay}" />
<local:PropertyRow <local:PropertyRow x:Uid="LyricsSearchControlDurauion" Value="{x:Bind ViewModel.MediaSessionsService.CurrentLyricsSearchResult.Duration, Converter={StaticResource SecondsToFormattedTimeConverter}, TargetNullValue=N/A, Mode=OneWay}" />
x:Uid="LyricsSearchControlDurauion"
Unit="s"
Value="{x:Bind ViewModel.MediaSessionsService.CurrentLyricsSearchResult.Duration, TargetNullValue=N/A, Mode=OneWay}" />
<local:PropertyRow x:Uid="LyricsPageLanguageCode" Value="{x:Bind ViewModel.MediaSessionsService.CurrentLyricsData.LanguageCode, TargetNullValue=N/A, Mode=OneWay, Converter={StaticResource LanguageCodeToDisplayedNameConverter}}" /> <local:PropertyRow x:Uid="LyricsPageLanguageCode" Value="{x:Bind ViewModel.MediaSessionsService.CurrentLyricsData.LanguageCode, TargetNullValue=N/A, Mode=OneWay, Converter={StaticResource LanguageCodeToDisplayedNameConverter}}" />
<local:PropertyRow <local:PropertyRow
x:Uid="LyricsPageLyricsProviderPrefix" x:Uid="LyricsPageLyricsProviderPrefix"

View File

@@ -9,56 +9,85 @@
mc:Ignorable="d"> mc:Ignorable="d">
<Grid> <Grid>
<StackPanel Width="400" Spacing="16"> <ScrollViewer>
<ProgressBar <StackPanel Width="400" Spacing="16">
x:Name="ProgressBar" <ProgressBar
IsIndeterminate="True" x:Name="ProgressBar"
Visibility="Collapsed" /> IsIndeterminate="True"
<InfoBar Visibility="Collapsed" />
x:Name="ErrorInfoBar" <InfoBar
IsClosable="True" x:Name="ErrorInfoBar"
IsOpen="False" IsClosable="True"
Severity="Error" /> IsOpen="False"
Severity="Error" />
<Grid ColumnDefinitions="*, Auto" ColumnSpacing="12">
<TextBox <TextBox
x:Name="HostBox" x:Name="NameBox"
x:Uid="RemoteServerConfigControlServerAddress" x:Uid="RemoteServerConfigControlName"
Grid.Column="0"
InputScope="Url"
PlaceholderText="192.168.1.x"
TextWrapping="Wrap" /> TextWrapping="Wrap" />
<NumberBox <StackPanel x:Name="RemoteFieldsPanel" Spacing="16">
x:Name="PortBox" <Grid ColumnDefinitions="*, Auto" ColumnSpacing="12">
x:Uid="RemoteServerConfigControlPort" <TextBox
Grid.Column="1" x:Name="HostBox"
MinWidth="100" x:Uid="RemoteServerConfigControlServerAddress"
LargeChange="10" Grid.Column="0"
SmallChange="1" InputScope="Url"
SpinButtonPlacementMode="Inline" PlaceholderText="192.168.1.x"
ToolTipService.ToolTip="80" TextWrapping="Wrap" />
Value="80" />
</Grid>
<TextBox <NumberBox
x:Name="PathBox" x:Name="PortBox"
x:Uid="RemoteServerConfigControlPath" x:Uid="RemoteServerConfigControlPort"
TextWrapping="Wrap" /> Grid.Column="1"
MinWidth="100"
LargeChange="10"
SmallChange="1"
SpinButtonPlacementMode="Inline"
ToolTipService.ToolTip="80"
Value="80" />
</Grid>
</StackPanel>
<Grid ColumnDefinitions="*, *" ColumnSpacing="12"> <Grid ColumnDefinitions="*, Auto" ColumnSpacing="8">
<TextBox <TextBox
x:Name="UserBox" x:Name="PathBox"
x:Uid="RemoteServerConfigControlUsername" x:Uid="RemoteServerConfigControlPath"
Grid.Column="0" Grid.Column="0"
TextWrapping="Wrap" /> TextChanged="PathBox_TextChanged"
TextWrapping="Wrap" />
<PasswordBox <Button
x:Name="PwdBox" x:Name="BrowseButton"
x:Uid="RemoteServerConfigControlPassword" x:Uid="RemoteServerConfigControlBrowse"
Grid.Column="1" Grid.Column="1"
PasswordRevealMode="Peek" /> VerticalAlignment="Bottom"
</Grid> Click="BrowseButton_Click"
</StackPanel> Visibility="Collapsed" />
</Grid>
<InfoBar
x:Name="PathWarningBar"
IsClosable="False"
IsOpen="False"
Severity="Warning" />
<StackPanel x:Name="AuthFieldsPanel" Spacing="16">
<Grid ColumnDefinitions="*, *" ColumnSpacing="12">
<TextBox
x:Name="UserBox"
x:Uid="RemoteServerConfigControlUsername"
Grid.Column="0"
TextWrapping="Wrap" />
<PasswordBox
x:Name="PwdBox"
x:Uid="RemoteServerConfigControlPassword"
Grid.Column="1"
PasswordRevealMode="Peek" />
</Grid>
</StackPanel>
</StackPanel>
</ScrollViewer>
</Grid> </Grid>
</UserControl> </UserControl>

View File

@@ -1,6 +1,8 @@
using BetterLyrics.WinUI3.Enums; using BetterLyrics.WinUI3.Enums;
using BetterLyrics.WinUI3.Helper;
using BetterLyrics.WinUI3.Models; using BetterLyrics.WinUI3.Models;
using BetterLyrics.WinUI3.Services.LocalizationService; using BetterLyrics.WinUI3.Services.LocalizationService;
using BetterLyrics.WinUI3.Views;
using CommunityToolkit.Mvvm.DependencyInjection; using CommunityToolkit.Mvvm.DependencyInjection;
using Microsoft.UI.Xaml; using Microsoft.UI.Xaml;
using Microsoft.UI.Xaml.Controls; using Microsoft.UI.Xaml.Controls;
@@ -10,96 +12,184 @@ namespace BetterLyrics.WinUI3.Controls
{ {
public sealed partial class RemoteServerConfigControl : UserControl public sealed partial class RemoteServerConfigControl : UserControl
{ {
private readonly string _protocolType; private readonly FileSourceType _fileSourceType;
private readonly ILocalizationService _localizationService = Ioc.Default.GetRequiredService<ILocalizationService>(); private readonly ILocalizationService _localizationService = Ioc.Default.GetRequiredService<ILocalizationService>();
public RemoteServerConfigControl(string protocolType) public RemoteServerConfigControl(FileSourceType fileSourceType)
{ {
this.InitializeComponent(); this.InitializeComponent();
_protocolType = protocolType; _fileSourceType = fileSourceType;
SetupDefaults(); SetupDefaults();
CheckPathForWarning();
} }
private void SetupDefaults() private void SetupDefaults()
{ {
switch (_protocolType.ToUpper()) if (_fileSourceType == FileSourceType.Local)
{ {
case "SMB": RemoteFieldsPanel.Visibility = Visibility.Collapsed;
PortBox.Value = 445; // SMB Ĭ<>϶˿<CFB6> AuthFieldsPanel.Visibility = Visibility.Collapsed;
PathBox.PlaceholderText = "SharedMusic";
BrowseButton.Visibility = Visibility.Visible;
PathBox.PlaceholderText = @"D:\Music";
}
else
{
BrowseButton.Visibility = Visibility.Collapsed;
RemoteFieldsPanel.Visibility = Visibility.Visible;
AuthFieldsPanel.Visibility = Visibility.Visible;
switch (_fileSourceType)
{
case FileSourceType.SMB:
PortBox.Value = 445;
PathBox.PlaceholderText = "SharedMusic";
break;
case FileSourceType.FTP:
PortBox.Value = 21;
PathBox.PlaceholderText = "/pub/music";
break;
case FileSourceType.WebDAV:
PortBox.Value = 80;
PathBox.PlaceholderText = "/dav/music";
break;
}
}
}
private string GetScheme()
{
string scheme = string.Empty;
switch (_fileSourceType)
{
case FileSourceType.SMB:
scheme = "smb";
break; break;
case "FTP": case FileSourceType.FTP:
PortBox.Value = 21; // FTP Ĭ<>϶˿<CFB6> scheme = "ftp";
PathBox.PlaceholderText = "/pub/music";
break; break;
case "WEBDAV": case FileSourceType.WebDAV:
PortBox.Value = 80; // WebDAV Ĭ<>϶˿<CFB6> scheme = "https";
PathBox.PlaceholderText = "/dav/music";
break; break;
} }
return scheme;
} }
public MediaFolder GetConfig() public MediaFolder GetConfig()
{ {
string finalName = HostBox.Text.Trim();
if (_fileSourceType == FileSourceType.Local)
{
if (string.IsNullOrWhiteSpace(PathBox.Text))
throw new ArgumentException(_localizationService.GetLocalizedString("RemoteServerConfigControlPathRequired"));
if (!string.IsNullOrWhiteSpace(NameBox.Text))
finalName = NameBox.Text.Trim();
else
finalName = PathBox.Text.TrimEnd(System.IO.Path.DirectorySeparatorChar);
return new MediaFolder
{
Name = finalName,
SourceType = FileSourceType.Local,
UriScheme = "file",
UriPath = PathBox.Text.Trim(),
};
}
if (string.IsNullOrWhiteSpace(HostBox.Text)) if (string.IsNullOrWhiteSpace(HostBox.Text))
throw new ArgumentException(_localizationService.GetLocalizedString("RemoteServerConfigControlServerAddressRequired")); throw new ArgumentException(_localizationService.GetLocalizedString("RemoteServerConfigControlServerAddressRequired"));
string name = $"{_protocolType} - {HostBox.Text}"; if (!string.IsNullOrWhiteSpace(NameBox.Text))
{
finalName = NameBox.Text.Trim();
}
else
{
finalName = $"{_fileSourceType} - {HostBox.Text}";
}
Enum.TryParse(_protocolType, true, out FileSourceType sourceType); string scheme = GetScheme();
var folder = new MediaFolder var folder = new MediaFolder
{ {
Name = name, Name = finalName,
Path = HostBox.Text, // <20><><EFBFBD><EFBFBD> Path <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> IP/Host SourceType = _fileSourceType,
Port = (int)PortBox.Value,
UserName = UserBox.Text, UriScheme = scheme,
Password = PwdBox.Password, // <20><> PasswordBox <EFBFBD><EFBFBD>ȡ<EFBFBD><EFBFBD><EFBFBD><EFBFBD> UriHost = HostBox.Text.Trim(), // ȥ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>β<EFBFBD>ո<EFBFBD>
SourceType = sourceType, UriPort = (int)PortBox.Value,
IsRealTimeWatchEnabled = false
UriPath = PathBox.Text.Trim(),
UserName = UserBox.Text.Trim(),
Password = PwdBox.Password,
}; };
// <20><><EFBFBD><EFBFBD><E2B4A6>·<EFBFBD><C2B7><EFBFBD><EFBFBD>
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ҫ<EFBFBD><D2AA><><D4B6>·<EFBFBD><C2B7><>ӵ<EFBFBD> Path <20><EFBFBD><EFA3AC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><D2BB><EFBFBD>ֶδ<D6B6>
// Ϊ<>˼򵥣<CBBC><F2B5A5A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ѭ<EFBFBD><D1AD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> MediaFolder <20><><EFBFBD>
// <20><><EFBFBD><EFBFBD> MediaFolder <20><><EFBFBD><EFBFBD><EFBFBD>ټ<EFBFBD>һ<EFBFBD><D2BB> RemotePath <20>ֶΣ<D6B6><CEA3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> Path <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// *<2A><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>*<2A><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> MediaFolder <20><><EFBFBD><EFBFBD><E5A3AC><EFBFBD>ǿ<EFBFBD><C7BF><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Լ<EFBFBD><D4BC><EFBFBD><EFBFBD>
// Path <20>ֶδ洢<CEB4><E6B4A2>ʽ<EFBFBD><CABD> "192.168.1.5/Music"
var rawPath = PathBox.Text.Trim().TrimStart('/', '\\'); // ȥ<><C8A5><EFBFBD><EFBFBD>ͷ<EFBFBD><CDB7>б<EFBFBD><D0B1>
if (!string.IsNullOrEmpty(rawPath))
{
// <20>򵥵<EFBFBD>·<EFBFBD><C2B7>ƴ<EFBFBD><C6B4><EFBFBD>߼<EFBFBD>
if (sourceType == FileSourceType.SMB)
{
// SMBLibrary <20><><EFBFBD>߼<EFBFBD>ͨ<EFBFBD><CDA8><EFBFBD><EFBFBD> Host <20>ֿ<EFBFBD><D6BF><EFBFBD>ShareName <20>ֿ<EFBFBD>
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> IP <20><><EFBFBD><EFBFBD> Path <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFA3AC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ҫ<EFBFBD><D2AA> ShareName ƴ<>ں<EFBFBD><DABA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֶ<EFBFBD>
// Ϊ<>˷<EFBFBD><CBB7><EFBFBD><E3A3AC><EFBFBD><EFBFBD><EFBFBD><EFBFBD> IP <20><> ShareName ƴ<><C6B4>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD> Path
// <20><><EFBFBD><EFBFBD>: 192.168.1.5/Music
folder.Path = $"{HostBox.Text}/{rawPath}";
}
else
{
// FTP/WebDAV: 192.168.1.5/pub/music
folder.Path = $"{HostBox.Text}/{rawPath}";
}
}
return folder; return folder;
} }
public void ShowError(string message) public void ShowError(string? message)
{ {
ErrorInfoBar.Message = message; ErrorInfoBar.Message = message;
ErrorInfoBar.IsOpen = true; ErrorInfoBar.IsOpen = !string.IsNullOrWhiteSpace(message);
} }
public void SetProgressBarVisibility(Visibility visibility) public void SetProgressBarVisibility(Visibility visibility)
{ {
ProgressBar.Visibility = visibility; ProgressBar.Visibility = visibility;
} }
private void CheckPathForWarning()
{
string? path = PathBox.Text?.Trim();
bool isSymbolRoot = string.IsNullOrEmpty(path) ||
path == "/" ||
path == "\\";
bool isDriveRoot = false;
if (!string.IsNullOrEmpty(path))
{
var normalized = path.TrimEnd('\\', '/');
isDriveRoot = normalized.EndsWith(":") && normalized.Length == 2;
}
bool isRoot = isSymbolRoot || isDriveRoot;
if (isRoot)
{
PathWarningBar.Message = _localizationService.GetLocalizedString("FileSystemServiceRootDirectoryWarning");
PathWarningBar.IsOpen = true;
}
else
{
PathWarningBar.IsOpen = false;
}
}
private void PathBox_TextChanged(object sender, TextChangedEventArgs e)
{
CheckPathForWarning();
}
private async void BrowseButton_Click(object sender, RoutedEventArgs e)
{
try
{
var folder = await PickerHelper.PickSingleFolderAsync<SettingsWindow>();
if (folder != null)
{
PathBox.Text = folder.Path;
}
}
catch (Exception ex)
{
ShowError(ex.Message);
}
}
} }
} }

View File

@@ -0,0 +1,302 @@
<?xml version="1.0" encoding="utf-8" ?>
<UserControl
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:converters="using:BetterLyrics.WinUI3.Converter"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:local="using:BetterLyrics.WinUI3.Controls"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:models="using:BetterLyrics.WinUI3.Models"
xmlns:statsmodels="using:BetterLyrics.WinUI3.Models.Stats"
xmlns:ui="using:CommunityToolkit.WinUI"
mc:Ignorable="d">
<UserControl.Resources>
<Style x:Key="StatsCardStyle" TargetType="Border">
<Setter Property="Background" Value="{ThemeResource LayerFillColorDefaultBrush}" />
<Setter Property="BorderBrush" Value="{ThemeResource CardStrokeColorDefaultBrush}" />
<Setter Property="BorderThickness" Value="1" />
<Setter Property="CornerRadius" Value="8" />
<Setter Property="Padding" Value="16" />
<Setter Property="Margin" Value="0,0,12,12" />
</Style>
</UserControl.Resources>
<Grid Margin="0,24,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>
<ScrollViewer Grid.Row="1" Padding="20,0">
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="Auto" />
<RowDefinition Height="Auto" />
<RowDefinition Height="*" />
</Grid.RowDefinitions>
<Grid Grid.Row="0" Margin="0,20,0,0">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*" />
<ColumnDefinition Width="*" />
<ColumnDefinition Width="*" />
</Grid.ColumnDefinitions>
<!-- 总播放时长 -->
<Border Grid.Column="0" Style="{StaticResource StatsCardStyle}">
<StackPanel>
<StackPanel
Opacity="0.8"
Orientation="Horizontal"
Spacing="8">
<FontIcon FontSize="14" Glyph="&#xE916;" />
<TextBlock x:Uid="StatsDashboardControlTotalDuration" Style="{ThemeResource CaptionTextBlockStyle}" />
</StackPanel>
<StackPanel
Margin="0,8,0,0"
Orientation="Horizontal"
Spacing="4">
<TextBlock
Foreground="{ThemeResource AccentTextFillColorPrimaryBrush}"
Style="{ThemeResource SubtitleTextBlockStyle}"
Text="{x:Bind ViewModel.TotalDuration.TotalHours, Mode=OneWay}" />
<TextBlock
Margin="0,0,0,2"
VerticalAlignment="Bottom"
Foreground="{ThemeResource AccentTextFillColorPrimaryBrush}"
Opacity="0.8"
Style="{ThemeResource CaptionTextBlockStyle}"
Text="Hrs" />
</StackPanel>
</StackPanel>
</Border>
<!-- 总播放歌曲次数 -->
<Border Grid.Column="1" Style="{StaticResource StatsCardStyle}">
<StackPanel>
<StackPanel
Opacity="0.8"
Orientation="Horizontal"
Spacing="8">
<FontIcon FontSize="14" Glyph="&#xE8D6;" />
<TextBlock x:Uid="StatsDashboardControlTracksPlayed" Style="{ThemeResource CaptionTextBlockStyle}" />
</StackPanel>
<TextBlock
Margin="0,8,0,0"
Style="{ThemeResource SubtitleTextBlockStyle}"
Text="{x:Bind ViewModel.TotalTracksPlayed, Mode=OneWay}" />
</StackPanel>
</Border>
<!-- Top source -->
<Border
Grid.Column="2"
Margin="0,0,0,12"
Style="{StaticResource StatsCardStyle}">
<StackPanel>
<StackPanel
Opacity="0.8"
Orientation="Horizontal"
Spacing="8">
<FontIcon FontSize="14" Glyph="&#xEC4A;" />
<TextBlock x:Uid="StatsDashboardControlTopSource" Style="{ThemeResource CaptionTextBlockStyle}" />
</StackPanel>
<TextBlock
Margin="0,8,0,0"
Style="{ThemeResource SubtitleTextBlockStyle}"
Text="{x:Bind ViewModel.TopPlayerName, Mode=OneWay}" />
</StackPanel>
</Border>
</Grid>
<Grid Grid.Row="1">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="1.5*" />
<ColumnDefinition Width="*" />
</Grid.ColumnDefinitions>
<!-- Top artists -->
<Border Grid.Column="0" Style="{StaticResource StatsCardStyle}">
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="Auto" />
<RowDefinition Height="*" />
</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>
</Grid>
</Border>
<!-- Top sources -->
<Border
Grid.Column="1"
Margin="0,0,0,12"
Style="{StaticResource StatsCardStyle}">
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="Auto" />
<RowDefinition Height="*" />
</Grid.RowDefinitions>
<TextBlock
x:Uid="StatsDashboardControlSources"
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>
</Grid>
</Border>
</Grid>
<!-- Top song -->
<Border
Grid.Row="2"
Margin="0,0,0,20"
Style="{StaticResource StatsCardStyle}">
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="Auto" />
<RowDefinition Height="*" />
</Grid.RowDefinitions>
<TextBlock
x:Uid="StatsDashboardControlTopSongs"
Margin="0,0,0,12"
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>
<Grid
Width="40"
Height="40"
Margin="0,0,12,0"
Background="{ThemeResource LayerFillColorAltBrush}"
CornerRadius="4">
<FontIcon
FontSize="16"
Foreground="{ThemeResource SystemControlForegroundBaseMediumBrush}"
Glyph="&#xE8D6;" />
</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>
</Grid>
</Border>
</Grid>
</ScrollViewer>
<Button
Grid.Row="1"
HorizontalAlignment="Right"
VerticalAlignment="Bottom"
Command="{x:Bind ViewModel.GenerateTestDataCommand}"
Content="Generate test data"
Visibility="Collapsed" />
</Grid>
</UserControl>

View File

@@ -0,0 +1,58 @@
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Runtime.InteropServices.WindowsRuntime;
using Windows.Foundation;
using Windows.Foundation.Collections;
using Microsoft.UI.Xaml;
using Microsoft.UI.Xaml.Controls;
using Microsoft.UI.Xaml.Controls.Primitives;
using Microsoft.UI.Xaml.Data;
using Microsoft.UI.Xaml.Input;
using Microsoft.UI.Xaml.Media;
using Microsoft.UI.Xaml.Navigation;
using BetterLyrics.WinUI3.ViewModels;
using CommunityToolkit.Mvvm.DependencyInjection;
using BetterLyrics.WinUI3.Enums;
// To learn more about WinUI, the WinUI project structure,
// and more about our project templates, see: http://aka.ms/winui-project-info.
namespace BetterLyrics.WinUI3.Controls;
public sealed partial class StatsDashboardControl : UserControl
{
public StatsDashboardControlViewModel ViewModel => (StatsDashboardControlViewModel)DataContext;
public StatsDashboardControl()
{
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

@@ -18,13 +18,7 @@
<TextBlock x:Uid="AppSettingsControlGeneral" Style="{StaticResource SettingsSectionHeaderTextBlockStyle}" /> <TextBlock x:Uid="AppSettingsControlGeneral" Style="{StaticResource SettingsSectionHeaderTextBlockStyle}" />
<dev:SettingsCard x:Uid="SettingsPageConfigName" HeaderIcon="{ui:FontIcon FontFamily={StaticResource IconFontFamily}, Glyph=&#xE8AC;}"> <dev:SettingsCard x:Uid="SettingsPageConfigName" HeaderIcon="{ui:FontIcon FontFamily={StaticResource IconFontFamily}, Glyph=&#xE8AC;}">
<StackPanel <TextBox Text="{x:Bind LyricsWindowStatus.Name, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" TextWrapping="Wrap" />
Margin="0,6,0,0"
Orientation="Horizontal"
Spacing="6">
<TextBox Text="{x:Bind LyricsWindowStatus.Name, Mode=TwoWay}" TextWrapping="Wrap" />
<Button Content="{ui:FontIcon FontFamily={StaticResource IconFontFamily}, FontSize=12, Glyph=&#xE8FB;}" Style="{StaticResource GhostButtonStyle}" />
</StackPanel>
</dev:SettingsCard> </dev:SettingsCard>
<dev:SettingsExpander <dev:SettingsExpander

View File

@@ -17,20 +17,16 @@ namespace BetterLyrics.WinUI3.Converter
using (var ms = new MemoryStream(byteArray)) using (var ms = new MemoryStream(byteArray))
{ {
var stream = ms.AsRandomAccessStream(); var stream = ms.AsRandomAccessStream();
var bitmapImage = new BitmapImage(); var bitmapImage = new BitmapImage();
bitmapImage.SetSource(stream); bitmapImage.SetSource(stream);
return bitmapImage; return bitmapImage;
} }
} }
catch catch { }
{
return PathHelper.AlbumArtPlaceholderPath;
}
} }
return PathHelper.AlbumArtPlaceholderPath; return new BitmapImage(new Uri(PathHelper.AlbumArtPlaceholderPath));
} }
public object ConvertBack(object value, Type targetType, object parameter, string language) public object ConvertBack(object value, Type targetType, object parameter, string language)

View File

@@ -15,7 +15,7 @@ namespace BetterLyrics.WinUI3.Converter
FileSourceType.Local => "\uE8B7", // Folder FileSourceType.Local => "\uE8B7", // Folder
FileSourceType.SMB => "\uE839", // Network FileSourceType.SMB => "\uE839", // Network
FileSourceType.FTP => "\uE838", // Globe FileSourceType.FTP => "\uE838", // Globe
FileSourceType.WebDav => "\uE753", // Cloud FileSourceType.WebDAV => "\uE753", // Cloud
_ => "\uE8B7" _ => "\uE8B7"
}; };
} }

View File

@@ -3,18 +3,37 @@ using System;
namespace BetterLyrics.WinUI3.Converter namespace BetterLyrics.WinUI3.Converter
{ {
public class MillisecondsToFormattedTimeConverter : IValueConverter public partial class MillisecondsToFormattedTimeConverter : IValueConverter
{ {
public object Convert(object value, Type targetType, object parameter, string language) public object Convert(object value, Type targetType, object parameter, string language)
{ {
if (value is int milliseconds) double? milliseconds = null;
if (value is int iVal) milliseconds = iVal;
else if (value is double dVal) milliseconds = dVal;
else if (value is long lVal) milliseconds = lVal;
if (milliseconds.HasValue)
{ {
return TimeSpan.FromMilliseconds(milliseconds).ToString(@"mm\:ss\.fff"); var ts = TimeSpan.FromMilliseconds(milliseconds.Value);
}
else if (value is double doubleMilliseconds) string? format = parameter?.ToString();
{
return TimeSpan.FromMilliseconds(doubleMilliseconds).ToString(@"mm\:ss\.fff"); if (string.IsNullOrEmpty(format))
{
format = @"mm\:ss\.fff";
}
try
{
return ts.ToString(format);
}
catch (FormatException)
{
return ts.ToString();
}
} }
return value?.ToString() ?? ""; return value?.ToString() ?? "";
} }

View File

@@ -3,7 +3,7 @@ using System;
namespace BetterLyrics.WinUI3.Converter namespace BetterLyrics.WinUI3.Converter
{ {
public class MillisecondsToSecondsConverter : IValueConverter public partial class MillisecondsToSecondsConverter : IValueConverter
{ {
public object Convert(object value, Type targetType, object parameter, string language) public object Convert(object value, Type targetType, object parameter, string language)
{ {

View File

@@ -0,0 +1,31 @@
using BetterLyrics.WinUI3.Helper;
using Microsoft.UI.Xaml.Data;
using Microsoft.UI.Xaml.Media.Imaging;
using System;
using System.Collections.Generic;
using System.IO;
using System.Text;
namespace BetterLyrics.WinUI3.Converter
{
public partial class PathToImageConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, string language)
{
string targetPath = PathHelper.AlbumArtPlaceholderPath;
if (value is string path)
{
if (File.Exists(path))
{
targetPath = path;
}
}
return new BitmapImage(new Uri(targetPath));
}
public object ConvertBack(object value, Type targetType, object parameter, string language)
{
throw new NotImplementedException();
}
}
}

View File

@@ -0,0 +1,15 @@
using System;
using System.Collections.Generic;
using System.Text;
namespace BetterLyrics.WinUI3.Enums
{
public enum AutoScanInterval
{
Disabled,
Every15Minutes,
EveryHour,
Every6Hours,
Daily
}
}

View File

@@ -5,6 +5,6 @@
Local, Local,
SMB, SMB,
FTP, FTP,
WebDav WebDAV
} }
} }

View File

@@ -0,0 +1,15 @@
using System;
using System.Collections.Generic;
using System.Text;
namespace BetterLyrics.WinUI3.Enums
{
public enum StatsRange
{
Day,
Week,
Month,
Quarter,
Year
}
}

View File

@@ -0,0 +1,123 @@
using BetterLyrics.WinUI3.Helper;
using BetterLyrics.WinUI3.Models;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace BetterLyrics.WinUI3.Extensions
{
public static class LyricsDataExtensions
{
extension(LyricsData lyricsData)
{
public static LyricsData GetLoadingPlaceholder()
{
return new LyricsData()
{
LyricsLines = [
new LyricsLine
{
StartMs = 0,
EndMs = (int)TimeSpan.FromMinutes(99).TotalMilliseconds,
OriginalText = "● ● ●",
},
],
LanguageCode = "N/A",
};
}
public void SetTranslatedText(LyricsData translationData, int toleranceMs = 50)
{
foreach (var line in lyricsData.LyricsLines)
{
// 在翻译歌词中查找与当前行开始时间最接近且在容忍范围内的行
var transLine = translationData.LyricsLines
.FirstOrDefault(t => Math.Abs(t.StartMs - line.StartMs) <= toleranceMs);
if (transLine != null)
{
// 此处 transLine.OriginalText 指翻译中的“原文”属性
line.TranslatedText = transLine.OriginalText;
}
else
{
// 没有匹配的翻译
line.TranslatedText = "";
}
}
}
public void SetPhoneticText(LyricsData phoneticData, int toleranceMs = 50)
{
foreach (var line in lyricsData.LyricsLines)
{
// 在音译歌词中查找与当前行开始时间最接近且在容忍范围内的行
var transLine = phoneticData.LyricsLines
.FirstOrDefault(t => Math.Abs(t.StartMs - line.StartMs) <= toleranceMs);
if (transLine != null)
{
// 此处 transLine.OriginalText 指音译中的“原文”属性
line.PhoneticText = transLine.OriginalText;
}
else
{
// 没有匹配的音译
line.PhoneticText = "";
}
}
}
public void SetTranslation(string translation)
{
List<string> translationArr = translation.Split(StringHelper.NewLine).ToList();
int i = 0;
foreach (var line in lyricsData.LyricsLines)
{
if (i >= translationArr.Count)
{
line.TranslatedText = ""; // No translation available, keep empty
}
else
{
line.TranslatedText = translationArr[i];
}
i++;
}
}
public void SetTransliteration(string transliteration)
{
List<string> transliterationArr = transliteration.Split(StringHelper.NewLine).ToList();
int i = 0;
foreach (var line in lyricsData.LyricsLines)
{
if (i >= transliterationArr.Count)
{
line.PhoneticText = ""; // No transliteration available, keep empty
}
else
{
line.PhoneticText = transliterationArr[i];
}
i++;
}
}
public LyricsLine? GetLyricsLine(double sec)
{
for (int i = 0; i < lyricsData.LyricsLines.Count; i++)
{
var line = lyricsData.LyricsLines[i];
if (line.StartMs > sec * 1000)
{
return lyricsData.LyricsLines.ElementAtOrDefault(i - 1);
}
}
return null;
}
}
}
}

View File

@@ -1,4 +1,5 @@
using BetterLyrics.WinUI3.Models; using BetterLyrics.WinUI3.Models;
using System;
namespace BetterLyrics.WinUI3.Extensions namespace BetterLyrics.WinUI3.Extensions
{ {
@@ -30,6 +31,22 @@ namespace BetterLyrics.WinUI3.Extensions
songInfo.Album = value; songInfo.Album = value;
return songInfo; return songInfo;
} }
public PlayHistoryItem? ToPlayHistoryItem(double actualPlayedMs)
{
if (songInfo == null) return null;
return new PlayHistoryItem
{
Title = songInfo.Title,
Artist = songInfo.DisplayArtists,
Album = songInfo.Album,
PlayerId = songInfo.PlayerId ?? "N/A",
TotalDurationMs = songInfo.DurationMs,
DurationPlayedMs = actualPlayedMs,
StartedAt = DateTime.Now.AddMilliseconds(-actualPlayedMs)
};
}
} }
} }
} }

View File

@@ -5,8 +5,11 @@ using BetterLyrics.WinUI3.Extensions;
using BetterLyrics.WinUI3.Models; using BetterLyrics.WinUI3.Models;
using BetterLyrics.WinUI3.Serialization; using BetterLyrics.WinUI3.Serialization;
using System; using System;
using System.Collections.Generic;
using System.IO; using System.IO;
using System.Linq;
using System.Text; using System.Text;
using System.Threading.Tasks;
using Ude; using Ude;
namespace BetterLyrics.WinUI3.Helper namespace BetterLyrics.WinUI3.Helper
@@ -27,6 +30,18 @@ namespace BetterLyrics.WinUI3.Helper
return Encoding.GetEncoding(encoding); return Encoding.GetEncoding(encoding);
} }
public static async Task CopyFileAsync(string sourcePath, string destinationPath)
{
var dir = Path.GetDirectoryName(destinationPath);
if (!Directory.Exists(dir)) Directory.CreateDirectory(dir);
using (var sourceStream = new FileStream(sourcePath, FileMode.Open, FileAccess.Read, FileShare.Read))
using (var destinationStream = new FileStream(destinationPath, FileMode.Create, FileAccess.Write, FileShare.None))
{
await sourceStream.CopyToAsync(destinationStream);
}
}
public static string SanitizeFileName(string fileName, char replacement = '_') public static string SanitizeFileName(string fileName, char replacement = '_')
{ {
var invalidChars = Path.GetInvalidFileNameChars(); var invalidChars = Path.GetInvalidFileNameChars();
@@ -86,5 +101,15 @@ namespace BetterLyrics.WinUI3.Helper
".wav", ".aiff", ".aif", ".pcm", ".cda", ".dsf", ".dff", ".au", ".snd", ".wav", ".aiff", ".aif", ".pcm", ".cda", ".dsf", ".dff", ".au", ".snd",
".mid", ".midi", ".mod", ".xm", ".it", ".s3m" ".mid", ".midi", ".mod", ".xm", ".it", ".s3m"
}; };
public static readonly string[] LyricExtensions =
Enum.GetValues(typeof(LyricsSearchProvider)).Cast<LyricsSearchProvider>()
.Where(x => x.IsLocal())
.Select(x => x.GetLyricsFormat())
.Where(x => x != LyricsFormat.NotSpecified)
.Select(x => x.ToFileExtension())
.ToArray();
public static readonly HashSet<string> AllSupportedExtensions = new(MusicExtensions.Union(LyricExtensions));
} }
} }

View File

@@ -0,0 +1,89 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Collections.ObjectModel;
using BetterLyrics.WinUI3.Models;
public static class FolderTreeBuilder
{
public static ObservableCollection<FolderNode> Build(List<ExtendedTrack> tracks, List<MediaFolder> folderConfigs)
{
var rootNodes = new ObservableCollection<FolderNode>();
// 按 MediaFolderId 分组
var folderGroups = tracks.GroupBy(t => t.MediaFolderId);
foreach (var group in folderGroups)
{
var config = folderConfigs.FirstOrDefault(f => f.Id == group.Key);
if (config == null) continue;
string baseUri = config.GetStandardUri().AbsoluteUri.TrimEnd('/');
var rootNode = new FolderNode
{
SourceType = config.SourceType,
FolderName = config.Name ?? config.ConnectionSummary, // 显示用户自定义的名字
MediaFolderId = group.Key,
FolderPath = baseUri,
IsExpanded = true
};
foreach (var track in group)
{
try
{
if (!track.Uri.StartsWith(baseUri)) continue; // 防御性编程
string relativePart = track.Uri.Substring(baseUri.Length);
var segments = relativePart
.Split('/', StringSplitOptions.RemoveEmptyEntries)
.Select(s => System.Net.WebUtility.UrlDecode(s))
.ToArray();
if (segments.Length > 1) // 长度大于1说明在子文件夹里
{
var folderSegments = segments.Take(segments.Length - 1).ToArray();
CreateFolderStructure(rootNode, folderSegments, baseUri);
}
}
catch { }
}
rootNodes.Add(rootNode);
}
return rootNodes;
}
private static void CreateFolderStructure(FolderNode parent, string[] segments, string rootBaseUri)
{
var current = parent;
string currentFullPath = parent.FolderPath;
foreach (var segmentName in segments)
{
var existingChild = current.SubFolders.FirstOrDefault(f => f.FolderName == segmentName);
currentFullPath += "/" + System.Net.WebUtility.UrlEncode(segmentName);
if (existingChild == null)
{
var newFolder = new FolderNode
{
FolderName = segmentName,
FolderPath = currentFullPath, // 存完整的 URI
MediaFolderId = parent.MediaFolderId
};
current.SubFolders.Add(newFolder);
current = newFolder;
}
else
{
current = existingChild;
currentFullPath = existingChild.FolderPath;
}
}
}
}

View File

@@ -33,6 +33,7 @@ namespace BetterLyrics.WinUI3.Helper
public static string SaltPlayerForWindowsLogoPath => Path.Combine(AssetsFolder, "SaltPlayerForWindows.png"); public static string SaltPlayerForWindowsLogoPath => Path.Combine(AssetsFolder, "SaltPlayerForWindows.png");
public static string MoeKoeMusicLogoPath => Path.Combine(AssetsFolder, "MoeKoeMusic.png"); public static string MoeKoeMusicLogoPath => Path.Combine(AssetsFolder, "MoeKoeMusic.png");
public static string Listen1LogoPath => Path.Combine(AssetsFolder, "Listen1.png"); public static string Listen1LogoPath => Path.Combine(AssetsFolder, "Listen1.png");
public static string OriginalSoundHQPlayerLogoPath => Path.Combine(AssetsFolder, "OriginalSoundHQPlayer.png");
public static string UnknownPlayerLogoPath => Path.Combine(AssetsFolder, "Question.png"); public static string UnknownPlayerLogoPath => Path.Combine(AssetsFolder, "Question.png");
public static string LogDirectory => Path.Combine(CacheFolder, "logs"); public static string LogDirectory => Path.Combine(CacheFolder, "logs");
@@ -54,8 +55,11 @@ namespace BetterLyrics.WinUI3.Helper
public static string AlbumArtCacheDirectory => Path.Combine(CacheFolder, "album-art"); public static string AlbumArtCacheDirectory => Path.Combine(CacheFolder, "album-art");
public static string iTunesAlbumArtCacheDirectory => Path.Combine(AlbumArtCacheDirectory, "itunes"); public static string iTunesAlbumArtCacheDirectory => Path.Combine(AlbumArtCacheDirectory, "itunes");
public static string LocalAlbumArtCacheDirectory => Path.Combine(AlbumArtCacheDirectory, "local");
public static string PlayQueuePath => Path.Combine(CacheFolder, "play-queue.m3u"); public static string PlayQueuePath => Path.Combine(LocalFolder, "play-queue.m3u");
public static string PlayHistoryPath => Path.Combine(LocalFolder, "play-history.db");
public static string FilesIndexPath => Path.Combine(LocalFolder, "files-index.db");
public static void EnsureDirectories() public static void EnsureDirectories()
{ {
@@ -75,6 +79,7 @@ namespace BetterLyrics.WinUI3.Helper
Directory.CreateDirectory(LocalTtmlCacheDirectory); Directory.CreateDirectory(LocalTtmlCacheDirectory);
Directory.CreateDirectory(iTunesAlbumArtCacheDirectory); Directory.CreateDirectory(iTunesAlbumArtCacheDirectory);
Directory.CreateDirectory(LocalAlbumArtCacheDirectory);
} }
} }
} }

View File

@@ -4,7 +4,7 @@ using System.Text.RegularExpressions;
namespace BetterLyrics.WinUI3.Helper namespace BetterLyrics.WinUI3.Helper
{ {
public static class PlayerIDHelper public static class PlayerIdHelper
{ {
private static readonly List<string> neteaseFamilyRegex = private static readonly List<string> neteaseFamilyRegex =
[ [
@@ -25,64 +25,66 @@ namespace BetterLyrics.WinUI3.Helper
return false; return false;
} }
public static bool IsLXMusic(string? id) => id is PlayerID.LXMusic or PlayerID.LXMusicPortable; public static bool IsLXMusic(string? id) => id is PlayerId.LXMusic or PlayerId.LXMusicPortable;
public static bool IsAppleMusic(string? id) => id is PlayerID.AppleMusic or PlayerID.AppleMusicAlternative; public static bool IsAppleMusic(string? id) => id is PlayerId.AppleMusic or PlayerId.AppleMusicAlternative;
public static bool IsBetterLyrics(string? id) => id is PlayerID.BetterLyrics or PlayerID.BetterLyricsDebug; public static bool IsBetterLyrics(string? id) => id is PlayerId.BetterLyrics or PlayerId.BetterLyricsDebug;
public static string? GetDisplayName(string? id) => id switch public static string? GetDisplayName(string? id) => id switch
{ {
PlayerID.Spotify => PlayerName.Spotify, PlayerId.Spotify => PlayerName.Spotify,
PlayerID.AppleMusic => PlayerName.AppleMusic, PlayerId.AppleMusic => PlayerName.AppleMusic,
PlayerID.iTunes => PlayerName.iTunes, PlayerId.iTunes => PlayerName.iTunes,
PlayerID.KugouMusic => PlayerName.KugouMusic, PlayerId.KugouMusic => PlayerName.KugouMusic,
PlayerID.NetEaseCloudMusic => PlayerName.NetEaseCloudMusic, PlayerId.NetEaseCloudMusic => PlayerName.NetEaseCloudMusic,
PlayerID.QQMusic => PlayerName.QQMusic, PlayerId.QQMusic => PlayerName.QQMusic,
PlayerID.LXMusic => PlayerName.LXMusic, PlayerId.LXMusic => PlayerName.LXMusic,
PlayerID.LXMusicPortable => PlayerName.LXMusicPortable, PlayerId.LXMusicPortable => PlayerName.LXMusicPortable,
PlayerID.MediaPlayerWindows11 => PlayerName.MediaPlayerWindows11, PlayerId.MediaPlayerWindows11 => PlayerName.MediaPlayerWindows11,
PlayerID.AIMP => PlayerName.AIMP, PlayerId.AIMP => PlayerName.AIMP,
PlayerID.Foobar2000 => PlayerName.Foobar2000, PlayerId.Foobar2000 => PlayerName.Foobar2000,
PlayerID.MusicBee => PlayerName.MusicBee, PlayerId.MusicBee => PlayerName.MusicBee,
PlayerID.PotPlayer => PlayerName.PotPlayer, PlayerId.PotPlayer => PlayerName.PotPlayer,
PlayerID.Chrome => PlayerName.Chrome, PlayerId.Chrome => PlayerName.Chrome,
PlayerID.Edge => PlayerName.Edge, PlayerId.Edge => PlayerName.Edge,
PlayerID.BetterLyrics => PlayerName.BetterLyrics, PlayerId.BetterLyrics => PlayerName.BetterLyrics,
PlayerID.BetterLyricsDebug => PlayerName.BetterLyricsDebug, PlayerId.BetterLyricsDebug => PlayerName.BetterLyricsDebug,
PlayerID.SaltPlayerForWindowsMS => PlayerName.SaltPlayerForWindowsMS, PlayerId.SaltPlayerForWindowsMS => PlayerName.SaltPlayerForWindowsMS,
PlayerID.SaltPlayerForWindowsSteam => PlayerName.SaltPlayerForWindowsSteam, PlayerId.SaltPlayerForWindowsSteam => PlayerName.SaltPlayerForWindowsSteam,
PlayerID.MoeKoeMusic => PlayerName.MoeKoeMusic, PlayerId.MoeKoeMusic => PlayerName.MoeKoeMusic,
PlayerID.MoeKoeMusicAlternative => PlayerName.MoeKoeMusic, PlayerId.MoeKoeMusicAlternative => PlayerName.MoeKoeMusic,
PlayerID.Listen1 => PlayerName.Listen1, PlayerId.Listen1 => PlayerName.Listen1,
PlayerId.OriginalSoundHQPlayer => PlayerName.OriginalSoundHQPlayer,
_ => id, _ => id,
}; };
public static string GetLogoPath(string? id) => id switch public static string GetLogoPath(string? id) => id switch
{ {
PlayerID.Spotify => PathHelper.SpotifyLogoPath, PlayerId.Spotify => PathHelper.SpotifyLogoPath,
PlayerID.AppleMusic => PathHelper.AppleMusicLogoPath, PlayerId.AppleMusic => PathHelper.AppleMusicLogoPath,
PlayerID.AppleMusicAlternative => PathHelper.AppleMusicLogoPath, PlayerId.AppleMusicAlternative => PathHelper.AppleMusicLogoPath,
PlayerID.iTunes => PathHelper.iTunesLogoPath, PlayerId.iTunes => PathHelper.iTunesLogoPath,
PlayerID.KugouMusic => PathHelper.KugouMusicLogoPath, PlayerId.KugouMusic => PathHelper.KugouMusicLogoPath,
PlayerID.NetEaseCloudMusic => PathHelper.NetEaseCloudMusicLogoPath, PlayerId.NetEaseCloudMusic => PathHelper.NetEaseCloudMusicLogoPath,
PlayerID.QQMusic => PathHelper.QQMusicLogoPath, PlayerId.QQMusic => PathHelper.QQMusicLogoPath,
PlayerID.LXMusic => PathHelper.LXMusicLogoPath, PlayerId.LXMusic => PathHelper.LXMusicLogoPath,
PlayerID.LXMusicPortable => PathHelper.LXMusicLogoPath, PlayerId.LXMusicPortable => PathHelper.LXMusicLogoPath,
PlayerID.MediaPlayerWindows11 => PathHelper.MediaPlayerWindows11LogoPath, PlayerId.MediaPlayerWindows11 => PathHelper.MediaPlayerWindows11LogoPath,
PlayerID.AIMP => PathHelper.AIMPLogoPath, PlayerId.AIMP => PathHelper.AIMPLogoPath,
PlayerID.Foobar2000 => PathHelper.Foobar2000LogoPath, PlayerId.Foobar2000 => PathHelper.Foobar2000LogoPath,
PlayerID.MusicBee => PathHelper.MusicBeeLogoPath, PlayerId.MusicBee => PathHelper.MusicBeeLogoPath,
PlayerID.PotPlayer => PathHelper.PotPlayerLogoPath, PlayerId.PotPlayer => PathHelper.PotPlayerLogoPath,
PlayerID.Chrome => PathHelper.ChromeLogoPath, PlayerId.Chrome => PathHelper.ChromeLogoPath,
PlayerID.Edge => PathHelper.EdgeLogoPath, PlayerId.Edge => PathHelper.EdgeLogoPath,
PlayerID.BetterLyrics => PathHelper.LogoPath, PlayerId.BetterLyrics => PathHelper.LogoPath,
PlayerID.BetterLyricsDebug => PathHelper.LogoPath, PlayerId.BetterLyricsDebug => PathHelper.LogoPath,
PlayerID.SaltPlayerForWindowsMS => PathHelper.SaltPlayerForWindowsLogoPath, PlayerId.SaltPlayerForWindowsMS => PathHelper.SaltPlayerForWindowsLogoPath,
PlayerID.SaltPlayerForWindowsSteam => PathHelper.SaltPlayerForWindowsLogoPath, PlayerId.SaltPlayerForWindowsSteam => PathHelper.SaltPlayerForWindowsLogoPath,
PlayerID.MoeKoeMusic => PathHelper.MoeKoeMusicLogoPath, PlayerId.MoeKoeMusic => PathHelper.MoeKoeMusicLogoPath,
PlayerID.MoeKoeMusicAlternative => PathHelper.MoeKoeMusicLogoPath, PlayerId.MoeKoeMusicAlternative => PathHelper.MoeKoeMusicLogoPath,
PlayerID.Listen1 => PathHelper.Listen1LogoPath, PlayerId.Listen1 => PathHelper.Listen1LogoPath,
PlayerId.OriginalSoundHQPlayer => PathHelper.OriginalSoundHQPlayerLogoPath,
_ => PathHelper.UnknownPlayerLogoPath, _ => PathHelper.UnknownPlayerLogoPath,
}; };
} }

View File

@@ -1,7 +1,7 @@
using System; using System;
using System.IO; using System.IO;
namespace BetterLyrics.WinUI3.Models.FileSystem namespace BetterLyrics.WinUI3.Helper
{ {
public class StreamFileAbstraction : TagLib.File.IFileAbstraction public class StreamFileAbstraction : TagLib.File.IFileAbstraction
{ {
@@ -9,7 +9,7 @@ namespace BetterLyrics.WinUI3.Models.FileSystem
private readonly Stream _stream; private readonly Stream _stream;
private readonly bool _closeStreamOnDispose; private readonly bool _closeStreamOnDispose;
public StreamFileAbstraction(string path, Stream stream, bool closeStreamOnDispose = false) public StreamFileAbstraction(string path, Stream? stream, bool closeStreamOnDispose = false)
{ {
_name = Path.GetFileName(path); _name = Path.GetFileName(path);
_stream = stream ?? throw new ArgumentNullException(nameof(stream)); _stream = stream ?? throw new ArgumentNullException(nameof(stream));

View File

@@ -0,0 +1,72 @@
using System;
using System.Collections.Generic;
using System.Net;
using System.Net.Http;
using System.Text;
using System.Threading.Tasks;
namespace BetterLyrics.WinUI3.Helper
{
public static class WebDavProbeHelper
{
/// <summary>
/// 自动检测目标主机是 HTTP 还是 HTTPS
/// </summary>
/// <returns>返回 "https" 或 "http",如果都连不上返回 null</returns>
public static async Task<string?> DetectSchemeAsync(string host, int port, string? path, string? user, string? pwd)
{
if (port == 443) return "https";
if (port == 80) return "http";
// 忽略 SSL 证书错误,因为很多 NAS 是自签名的
var handler = new HttpClientHandler
{
ServerCertificateCustomValidationCallback = (message, cert, chain, errors) => true,
UseProxy = false
};
// 设置认证
if (!string.IsNullOrEmpty(user) && !string.IsNullOrEmpty(pwd))
{
handler.Credentials = new NetworkCredential(user, pwd);
handler.PreAuthenticate = true;
}
using var client = new HttpClient(handler);
client.Timeout = TimeSpan.FromSeconds(3);
if (await ProbeUrlAsync(client, "https", host, port, path))
{
return "https";
}
if (await ProbeUrlAsync(client, "http", host, port, path))
{
return "http";
}
// 都失败
return null;
}
private static async Task<bool> ProbeUrlAsync(HttpClient client, string scheme, string host, int port, string? path)
{
try
{
var uriBuilder = new UriBuilder(scheme, host, port, path);
// 使用 PROPFIND 方法,且 Depth 为 0只检测根节点是否存在不拉取列表
var request = new HttpRequestMessage(new HttpMethod("PROPFIND"), uriBuilder.Uri);
request.Headers.Add("Depth", "0");
var response = await client.SendAsync(request);
return response.StatusCode != HttpStatusCode.BadRequest;
}
catch
{
return false;
}
}
}
}

View File

@@ -17,12 +17,20 @@ namespace BetterLyrics.WinUI3.Hooks
static SystemVolumeHook() static SystemVolumeHook()
{ {
_deviceEnumerator = new MMDeviceEnumerator(); try
_defaultDevice = _deviceEnumerator.GetDefaultAudioEndpoint(DataFlow.Render, Role.Multimedia);
if (_defaultDevice != null)
{ {
_defaultDevice.AudioEndpointVolume.OnVolumeNotification += AudioEndpointVolume_OnVolumeNotification; _deviceEnumerator = new MMDeviceEnumerator();
// 找不到设备会抛出异常,在这里截获它
_defaultDevice = _deviceEnumerator.GetDefaultAudioEndpoint(DataFlow.Render, Role.Multimedia);
if (_defaultDevice != null)
{
_defaultDevice.AudioEndpointVolume.OnVolumeNotification += AudioEndpointVolume_OnVolumeNotification;
}
}
catch (Exception ex)
{
_defaultDevice = null;
} }
} }

View File

@@ -7,6 +7,7 @@ using FlaUI.Core.EventHandlers;
using FlaUI.UIA3; using FlaUI.UIA3;
using Microsoft.UI.Dispatching; using Microsoft.UI.Dispatching;
using System; using System;
using System.Diagnostics;
using System.Drawing; using System.Drawing;
using System.Threading; using System.Threading;
@@ -186,7 +187,8 @@ namespace BetterLyrics.WinUI3.Hooks
if (width < 20) return Rectangle.Empty; if (width < 20) return Rectangle.Empty;
return new Rectangle(finalLeft, taskbarRect.Top, width, taskbarRect.Height); var finalRect = new Rectangle(finalLeft, taskbarRect.Top, width, taskbarRect.Height);
return finalRect;
} }
catch (Exception ex) catch (Exception ex)
{ {

View File

@@ -0,0 +1,14 @@
using Microsoft.EntityFrameworkCore;
using System;
using System.Collections.Generic;
using System.Text;
namespace BetterLyrics.WinUI3.Models.Db
{
public partial class FilesIndexDbContext : DbContext
{
public FilesIndexDbContext(DbContextOptions<FilesIndexDbContext> options) : base(options) { }
public DbSet<FilesIndexItem> FilesIndex { get; set; }
}
}

View File

@@ -0,0 +1,14 @@
using Microsoft.EntityFrameworkCore;
using System;
using System.Collections.Generic;
using System.Text;
namespace BetterLyrics.WinUI3.Models.Db
{
public partial class PlayHistoryDbContext : DbContext
{
public PlayHistoryDbContext(DbContextOptions<PlayHistoryDbContext> options) : base(options) { }
public DbSet<PlayHistoryItem> PlayHistory { get; set; }
}
}

View File

@@ -1,28 +1,215 @@
using BetterLyrics.WinUI3.Models.FileSystem; using ATL;
using BetterLyrics.WinUI3.Helper;
using System; using System;
using System.IO; using System.IO;
using System.Linq;
namespace BetterLyrics.WinUI3.Models namespace BetterLyrics.WinUI3.Models
{ {
public class ExtendedTrack : ATL.Track public class ExtendedTrack
{ {
public new string Path { get; private set; } = ""; public string Uri { get; private set; } = "";
public string RawLyrics { get; set; } = "";
public string ParentFolderName => Directory.GetParent(Path)?.Name ?? ""; public string DecodedAbsoluteUri
public string ParentFolderPath => Directory.GetParent(Path)?.FullName ?? ""; {
public string FileName => System.IO.Path.GetFileName(Path); get
{
if (string.IsNullOrEmpty(Uri)) return "";
try
{
var u = new Uri(Uri);
return u.IsFile ? u.LocalPath : System.Net.WebUtility.UrlDecode(u.AbsoluteUri);
}
catch { return Uri; }
}
}
public string? RawLyrics { get; set; }
public string? LocalAlbumArtPath { get; set; }
public byte[]? AlbumArtByteArray { get; set; }
public string ParentFolderName
{
get
{
if (string.IsNullOrEmpty(Uri)) return "";
try
{
// 使用 Uri Segments 安全获取倒数第二层 (文件夹名)
// Segments 示例: "/", "Music/", "Artist/", "Song.mp3"
var u = new System.Uri(Uri);
if (u.Segments.Length > 1)
{
// 取倒数第二个 segment (如果是文件)
// 注意处理末尾斜杠
string folder = u.Segments[u.Segments.Length - 2];
return System.Net.WebUtility.UrlDecode(folder.TrimEnd('/', '\\'));
}
return "";
}
catch
{
return "";
}
}
}
public string ParentFolderPath
{
get
{
if (string.IsNullOrEmpty(Uri)) return "";
try
{
var u = new System.Uri(Uri);
if (u.IsFile)
{
// 本地文件:返回目录路径 C:\Music
return System.IO.Path.GetDirectoryName(u.LocalPath) ?? "";
}
else
{
// 远程文件:返回去掉文件名的 URI
// new Uri(u, ".") 表示当前目录
return new System.Uri(u, ".").AbsoluteUri;
}
}
catch
{
return "";
}
}
}
public string FileName
{
get
{
if (string.IsNullOrEmpty(Uri)) return "";
try
{
var u = new System.Uri(Uri);
if (u.IsFile) return System.IO.Path.GetFileName(u.LocalPath);
// 远程文件:获取 AbsolutePath 的最后一段并解码
// 例如: /Music/My%20Song.mp3 -> My Song.mp3
string rawName = System.IO.Path.GetFileName(u.AbsolutePath);
return System.Net.WebUtility.UrlDecode(rawName);
}
catch
{
return System.IO.Path.GetFileName(Uri);
}
}
}
public string MediaFolderId { get; set; } = "";
public string Title { get; set; } = "";
public string Artist { get; set; } = "";
public string Album { get; set; } = "";
public int? Year { get; set; }
public int Bitrate { get; set; }
public double SampleRate { get; set; }
public int BitDepth { get; set; }
public int Duration { get; set; }
public string AudioFormatName { get; set; } = "";
public string AudioFormatShortName { get; set; } = "";
public string Encoder { get; set; } = "";
public ExtendedTrack() : base() { } public ExtendedTrack() : base() { }
public ExtendedTrack(string path) : base(path) public ExtendedTrack(string uriString) : base()
{ {
Path = path; Uri = uriString;
string atlPath = uriString;
try
{
var u = new Uri(uriString);
if (u.IsFile) atlPath = u.LocalPath;
}
catch { }
// 用于本地文件
var track = new Track(atlPath);
SetFromTrack(track);
} }
public ExtendedTrack(string path, Stream stream) : base(stream, System.IO.Path.GetExtension(path)) public ExtendedTrack(FilesIndexItem? entity, Stream? stream = null) : base()
{ {
Path = path; if (entity == null) return;
SetRawLyrics(new StreamFileAbstraction(path, stream));
this.MediaFolderId = entity.MediaFolderId;
this.Uri = entity.Uri;
this.Title = entity.Title;
this.Artist = entity.Artists;
this.Album = entity.Album;
this.Year = entity.Year;
this.Bitrate = entity.Bitrate;
this.SampleRate = entity.SampleRate;
this.BitDepth = entity.BitDepth;
this.Duration = entity.Duration;
this.AudioFormatName = entity.AudioFormatName;
this.AudioFormatShortName = entity.AudioFormatShortName;
this.Encoder = entity.Encoder;
this.RawLyrics = entity.EmbeddedLyrics;
this.LocalAlbumArtPath = entity.LocalAlbumArtPath;
if (stream != null)
{
var track = new Track(stream, Path.GetExtension(FileName));
SetFromTrack(track);
SetRawLyrics(new StreamFileAbstraction(Uri, stream));
}
}
private void SetFromTrack(Track? track)
{
if (track == null) return;
this.Title = track.Title;
this.Artist = track.Artist;
this.Album = track.Album;
this.Year = track.Year;
this.Bitrate = track.Bitrate;
this.SampleRate = track.SampleRate;
this.BitDepth = track.BitDepth;
this.Duration = track.Duration;
this.AudioFormatName = track.AudioFormat.Name;
this.AudioFormatShortName = track.AudioFormat.ShortName;
this.Encoder = track.Encoder;
this.AlbumArtByteArray = null;
if (track.EmbeddedPictures != null && track.EmbeddedPictures.Count > 0)
{
try
{
var validPics = track.EmbeddedPictures.Where(p => p != null).ToList();
if (validPics.Count > 0)
{
var cover = validPics.FirstOrDefault(p => p.PicType == PictureInfo.PIC_TYPE.Front);
if (cover == null)
{
cover = validPics.First();
}
this.AlbumArtByteArray = cover.PictureData;
}
}
catch (Exception) { }
}
} }
private void SetRawLyrics(StreamFileAbstraction streamFileAbstraction) private void SetRawLyrics(StreamFileAbstraction streamFileAbstraction)
@@ -34,4 +221,4 @@ namespace BetterLyrics.WinUI3.Models
catch (Exception) { } catch (Exception) { }
} }
} }
} }

View File

@@ -1,53 +0,0 @@
using FluentFTP;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Threading.Tasks;
namespace BetterLyrics.WinUI3.Models.FileSystem
{
public partial class FTPFileSystem : IUnifiedFileSystem
{
private readonly AsyncFtpClient _client;
private readonly string _rootPath; // 服务器上的根路径 (例如 /pub/music)
public FTPFileSystem(string host, string user, string pass, int port, string remotePath)
{
// 如果 path 是 "192.168.1.5/Music",我们需要把 /Music 拆出来
// 但为了简单,假设 host 仅仅是 IPremotePath 才是路径
_rootPath = remotePath ?? "/";
var config = new FtpConfig { ConnectTimeout = 5000 };
_client = new AsyncFtpClient(host, user ?? "anonymous", pass ?? "", port > 0 ? port : 21, config);
}
public async Task<bool> ConnectAsync()
{
await _client.AutoConnect();
return _client.IsConnected;
}
public async Task<List<UnifiedFileItem>> GetFilesAsync(string relativePath)
{
string targetPath = Path.Combine(_rootPath, relativePath).Replace("\\", "/");
var items = await _client.GetListing(targetPath);
return items.Select(i => new UnifiedFileItem
{
Name = i.Name,
FullPath = i.FullName,
IsFolder = i.Type == FtpObjectType.Directory,
Size = i.Size,
LastModified = i.Modified
}).ToList();
}
public async Task<Stream> OpenReadAsync(string fullPath)
{
return await _client.OpenRead(fullPath);
}
public async Task DisconnectAsync() => await _client.Disconnect();
public void Dispose() => _client?.Dispose();
}
}

View File

@@ -1,15 +0,0 @@
using System;
using System.Collections.Generic;
using System.IO;
using System.Threading.Tasks;
namespace BetterLyrics.WinUI3.Models.FileSystem
{
public interface IUnifiedFileSystem : IDisposable
{
Task<bool> ConnectAsync();
Task<List<UnifiedFileItem>> GetFilesAsync(string relativePath);
Task<Stream> OpenReadAsync(string fullPath);
Task DisconnectAsync();
}
}

View File

@@ -1,56 +0,0 @@
using System.Collections.Generic;
using System.IO;
using System.Threading.Tasks;
namespace BetterLyrics.WinUI3.Models.FileSystem
{
public partial class LocalFileSystem : IUnifiedFileSystem
{
private readonly string _rootPath;
public LocalFileSystem(string rootPath)
{
_rootPath = rootPath;
}
public Task<bool> ConnectAsync()
{
return Task.FromResult(Directory.Exists(_rootPath));
}
public async Task<List<UnifiedFileItem>> GetFilesAsync(string relativePath)
{
var result = new List<UnifiedFileItem>();
var targetPath = string.IsNullOrWhiteSpace(relativePath)
? _rootPath
: Path.Combine(_rootPath, relativePath);
if (!Directory.Exists(targetPath)) return result;
var dirInfo = new DirectoryInfo(targetPath);
foreach (var item in dirInfo.GetFileSystemInfos())
{
bool isDir = (item.Attributes & FileAttributes.Directory) == FileAttributes.Directory;
result.Add(new UnifiedFileItem
{
Name = item.Name,
FullPath = item.FullName,
IsFolder = isDir,
Size = isDir ? 0 : ((FileInfo)item).Length,
LastModified = item.LastWriteTime
});
}
return result;
}
public async Task<Stream> OpenReadAsync(string fullPath)
{
return new FileStream(fullPath, FileMode.Open, FileAccess.Read, FileShare.Read);
}
public async Task DisconnectAsync() => await Task.CompletedTask;
public void Dispose() { }
}
}

View File

@@ -1,130 +0,0 @@
using SMBLibrary;
using SMBLibrary.Client;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Threading.Tasks;
namespace BetterLyrics.WinUI3.Models.FileSystem
{
public partial class SMBFileSystem : IUnifiedFileSystem
{
private SMB2Client _client;
private ISMBFileStore _fileStore;
private readonly string _ip;
private readonly string _shareName;
private readonly string _pathInsideShare; // 共享里的子路径
private readonly string _username;
private readonly string _password;
// fullPathInput 例如: "192.168.1.5/Music/Pop"
public SMBFileSystem(string fullPathInput, string user, string pass)
{
_username = user;
_password = pass;
// 解析路径:分离 IP 和 共享名
var parts = fullPathInput.Replace("\\", "/").Split(new[] { '/' }, StringSplitOptions.RemoveEmptyEntries);
if (parts.Length >= 1) _ip = parts[0];
if (parts.Length >= 2) _shareName = parts[1];
// 剩下的部分重新拼起来作为子路径
if (parts.Length > 2)
_pathInsideShare = string.Join("\\", parts.Skip(2));
else
_pathInsideShare = "";
}
public async Task<bool> ConnectAsync()
{
_client = new SMB2Client();
bool connected = _client.Connect(_ip, SMBTransportType.DirectTCPTransport);
if (!connected) return false;
var status = _client.Login(string.Empty, _username, _password);
if (status != NTStatus.STATUS_SUCCESS) return false;
// 连接具体的共享文件夹
if (string.IsNullOrEmpty(_shareName)) return true; // 只连了服务器,没连共享
_fileStore = _client.TreeConnect(_shareName, out status);
return status == NTStatus.STATUS_SUCCESS;
}
public async Task<List<UnifiedFileItem>> GetFilesAsync(string relativePath)
{
var result = new List<UnifiedFileItem>();
if (_fileStore == null) return result;
// 拼接完整路径: Root里面的子路径 + 传入的相对路径
string queryPath = Path.Combine(_pathInsideShare, relativePath).Replace("/", "\\").TrimStart('\\');
// 打开目录
var statusRet = _fileStore.CreateFile(out object handle, out FileStatus status, queryPath,
AccessMask.GENERIC_READ, SMBLibrary.FileAttributes.Directory, ShareAccess.Read,
CreateDisposition.FILE_OPEN, CreateOptions.FILE_DIRECTORY_FILE, null);
if (statusRet != NTStatus.STATUS_SUCCESS) return result;
List<QueryDirectoryFileInformation> fileInfo;
do
{
statusRet = _fileStore.QueryDirectory(out fileInfo, handle, "*", FileInformationClass.FileDirectoryInformation);
List<FileDirectoryInformation> list = fileInfo.Select(x => (FileDirectoryInformation)x).ToList();
foreach (var item in list)
{
// 排除当前目录和父目录
if (item.FileName == "." || item.FileName == "..") continue;
result.Add(new UnifiedFileItem
{
Name = item.FileName,
FullPath = Path.Combine(queryPath, item.FileName),
IsFolder = (item.FileAttributes & SMBLibrary.FileAttributes.Directory) == SMBLibrary.FileAttributes.Directory,
Size = item.AllocationSize,
LastModified = item.LastWriteTime
});
}
if (statusRet == NTStatus.STATUS_NO_MORE_FILES)
{
break;
}
if (statusRet != NTStatus.STATUS_SUCCESS)
{
// Log
break;
}
} while (statusRet == NTStatus.STATUS_SUCCESS);
_fileStore.CloseFile(handle);
return result;
}
public async Task<Stream> OpenReadAsync(string fullPath)
{
var ret = _fileStore.CreateFile(out object handle, out FileStatus status, fullPath,
AccessMask.GENERIC_READ | AccessMask.SYNCHRONIZE, 0, ShareAccess.Read, CreateDisposition.FILE_OPEN, 0, null);
if (ret != NTStatus.STATUS_SUCCESS) throw new IOException($"SMB Open Error: {ret}");
return new SMBReadOnlyStream(_fileStore, handle);
}
public async Task DisconnectAsync()
{
_client?.Disconnect();
await Task.CompletedTask;
}
public void Dispose()
{
_client?.Disconnect();
}
}
}

View File

@@ -1,13 +0,0 @@
using System;
namespace BetterLyrics.WinUI3.Models.FileSystem
{
public class UnifiedFileItem
{
public string Name { get; set; }
public string FullPath { get; set; }
public long Size { get; set; }
public bool IsFolder { get; set; }
public DateTime? LastModified { get; set; }
}
}

View File

@@ -1,86 +0,0 @@
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Threading.Tasks;
using WebDav;
namespace BetterLyrics.WinUI3.Models.FileSystem
{
public partial class WebDavFileSystem : IUnifiedFileSystem
{
private readonly WebDavClient _client;
private readonly string _baseUrl;
private readonly string _rootPath;
// host: http://192.168.1.5:5005
// path: /music
public WebDavFileSystem(string host, string user, string pass, int port, string path)
{
if (!host.StartsWith("http")) host = $"http://{host}";
if (port > 0) host = $"{host}:{port}";
_baseUrl = host;
_rootPath = path ?? "/";
_client = new WebDavClient(new WebDavClientParams
{
BaseAddress = new Uri(_baseUrl),
Credentials = new System.Net.NetworkCredential(user, pass)
});
}
public async Task<bool> ConnectAsync()
{
// WebDAV 无状态Propfind 测试根目录连通性
var result = await _client.Propfind(_rootPath);
return result.IsSuccessful;
}
public async Task<List<UnifiedFileItem>> GetFilesAsync(string relativePath)
{
var targetPath = Path.Combine(_rootPath, relativePath).Replace("\\", "/");
var result = await _client.Propfind(targetPath);
var list = new List<UnifiedFileItem>();
if (result.IsSuccessful)
{
foreach (var res in result.Resources)
{
if (res == null || res.Uri == null) continue;
// 排除掉文件夹自身 (WebDAV 通常会把当前请求的文件夹作为第一个结果返回)
// 通过判断 URL 结尾是否一致来简单过滤,或者判断 IsCollection 且 Uri 相同
// 这里简单处理:只要名字不为空
var name = System.Net.WebUtility.UrlDecode(res.Uri.Split('/').LastOrDefault());
if (string.IsNullOrEmpty(name)) continue;
// 如果名字和请求的目录名一样,可能是它自己,跳过 (这需要根据具体服务器响应调整)
// 更稳妥的是比较 Uri
list.Add(new UnifiedFileItem
{
Name = name,
FullPath = res.Uri.ToString(), // WebDAV 需要完整 URI
IsFolder = res.IsCollection,
Size = res.ContentLength ?? 0,
LastModified = res.LastModifiedDate
});
}
}
return list;
}
public async Task<Stream> OpenReadAsync(string fullPath)
{
// WebDAV 获取流
var res = await _client.GetRawFile(fullPath);
if (!res.IsSuccessful) throw new IOException($"WebDAV Error: {res.StatusCode}");
return res.Stream;
}
public async Task DisconnectAsync() => await Task.CompletedTask;
public void Dispose() => _client?.Dispose();
}
}

View File

@@ -0,0 +1,67 @@
using Microsoft.EntityFrameworkCore;
using System;
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;
namespace BetterLyrics.WinUI3.Models
{
[Index(nameof(MediaFolderId))] // 普通索引
[Index(nameof(ParentUri))] // 普通索引
[Index(nameof(Uri), IsUnique = true)] // 唯一索引
public class FilesIndexItem
{
[Key] // 主键
[DatabaseGenerated(DatabaseGeneratedOption.Identity)] // 明确指定为自增 (Identity)
public int Id { get; set; }
// 关联到 MediaFolder.Id
// 注意:作为索引列,必须限制长度,否则 SQL Server 会报错 (索引最大900字节)
[MaxLength(450)]
public string MediaFolderId { get; set; }
// 存储父文件夹的标准 URI
// 允许为空
[MaxLength(450)]
public string? ParentUri { get; set; }
// 唯一索引列
// 必须限制长度。450字符 * 2字节/字符 = 900字节 (正好卡在 SQL Server 限制内)
[Required]
[MaxLength(450)]
public string Uri { get; set; }
public string FileName { get; set; } = "";
public bool IsDirectory { get; set; }
public long FileSize { get; set; }
public DateTime? LastModified { get; set; }
// 下面的元数据字段通常不需要索引,可以使用 MaxLength 稍微优化空间,
// 或者直接留空(默认为 nvarchar(max)
public string Title { get; set; } = "";
public string Artists { get; set; } = "";
public string Album { get; set; } = "";
public int? Year { get; set; }
public int Bitrate { get; set; }
public double SampleRate { get; set; }
public int BitDepth { get; set; }
public int Duration { get; set; }
[MaxLength(50)] // 格式名称通常很短,限制一下是个好习惯
public string AudioFormatName { get; set; } = "";
[MaxLength(20)]
public string AudioFormatShortName { get; set; } = "";
public string Encoder { get; set; } = "";
// 歌词可能会很长,保留默认的 nvarchar(max) 即可
public string? EmbeddedLyrics { get; set; }
public string? LocalAlbumArtPath { get; set; }
public bool IsMetadataParsed { get; set; }
}
}

View File

@@ -0,0 +1,24 @@
using BetterLyrics.WinUI3.Enums;
using CommunityToolkit.Mvvm.ComponentModel;
using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Text;
namespace BetterLyrics.WinUI3.Models
{
public partial class FolderNode : ObservableObject
{
public FileSourceType SourceType { get; set; } = FileSourceType.Local;
public string FolderName { get; set; } = "";
public string FolderPath { get; set; } = "";
public string MediaFolderId { get; set; } = "";
public ObservableCollection<FolderNode> SubFolders { get; set; } = new();
[ObservableProperty] public partial bool IsExpanded { get; set; }
}
}

View File

@@ -29,84 +29,6 @@ namespace BetterLyrics.WinUI3.Models
LyricsLines = lyricsLines; LyricsLines = lyricsLines;
} }
public void SetTranslatedText(LyricsData translationData, int toleranceMs = 50)
{
foreach (var line in LyricsLines)
{
// 在翻译歌词中查找与当前行开始时间最接近且在容忍范围内的行
var transLine = translationData.LyricsLines
.FirstOrDefault(t => Math.Abs(t.StartMs - line.StartMs) <= toleranceMs);
if (transLine != null)
{
// 此处 transLine.OriginalText 指翻译中的“原文”属性
line.TranslatedText = transLine.OriginalText;
}
else
{
// 没有匹配的翻译
line.TranslatedText = "";
}
}
}
public void SetPhoneticText(LyricsData phoneticData, int toleranceMs = 50)
{
foreach (var line in LyricsLines)
{
// 在音译歌词中查找与当前行开始时间最接近且在容忍范围内的行
var transLine = phoneticData.LyricsLines
.FirstOrDefault(t => Math.Abs(t.StartMs - line.StartMs) <= toleranceMs);
if (transLine != null)
{
// 此处 transLine.OriginalText 指音译中的“原文”属性
line.PhoneticText = transLine.OriginalText;
}
else
{
// 没有匹配的音译
line.PhoneticText = "";
}
}
}
public void SetTranslation(string translation)
{
List<string> translationArr = translation.Split(StringHelper.NewLine).ToList();
int i = 0;
foreach (var line in LyricsLines)
{
if (i >= translationArr.Count)
{
line.TranslatedText = ""; // No translation available, keep empty
}
else
{
line.TranslatedText = translationArr[i];
}
i++;
}
}
public void SetTransliteration(string transliteration)
{
List<string> transliterationArr = transliteration.Split(StringHelper.NewLine).ToList();
int i = 0;
foreach (var line in LyricsLines)
{
if (i >= transliterationArr.Count)
{
line.PhoneticText = ""; // No transliteration available, keep empty
}
else
{
line.PhoneticText = transliterationArr[i];
}
i++;
}
}
public static LyricsData GetNotfoundPlaceholder() public static LyricsData GetNotfoundPlaceholder()
{ {
return new LyricsData([new LyricsLine return new LyricsData([new LyricsLine
@@ -117,34 +39,5 @@ namespace BetterLyrics.WinUI3.Models
}]); }]);
} }
public static LyricsData GetLoadingPlaceholder()
{
return new LyricsData()
{
LyricsLines = [
new LyricsLine
{
StartMs = 0,
EndMs = (int)TimeSpan.FromMinutes(99).TotalMilliseconds,
OriginalText = "● ● ●",
},
],
LanguageCode = "N/A",
};
}
public LyricsLine? GetLyricsLine(double sec)
{
for (int i = 0; i < LyricsLines.Count; i++)
{
var line = LyricsLines[i];
if (line.StartMs > sec * 1000)
{
return LyricsLines.ElementAtOrDefault(i - 1);
}
}
return null;
}
} }
} }

View File

@@ -1,11 +1,12 @@
// 2025/6/23 by Zhe Fang using BetterLyrics.WinUI3.Enums;
using BetterLyrics.WinUI3.Enums;
using BetterLyrics.WinUI3.Helper; using BetterLyrics.WinUI3.Helper;
using BetterLyrics.WinUI3.Models.FileSystem; using BetterLyrics.WinUI3.Services.FileSystemService;
using BetterLyrics.WinUI3.Services.FileSystemService.Providers;
using CommunityToolkit.Mvvm.ComponentModel; using CommunityToolkit.Mvvm.ComponentModel;
using Microsoft.UI.Xaml.Controls;
using System; using System;
using System.Text.Json.Serialization; using System.Text.Json.Serialization;
using System.Threading;
namespace BetterLyrics.WinUI3.Models namespace BetterLyrics.WinUI3.Models
{ {
@@ -14,32 +15,83 @@ namespace BetterLyrics.WinUI3.Models
[ObservableProperty] public partial string Id { get; set; } = Guid.NewGuid().ToString(); [ObservableProperty] public partial string Id { get; set; } = Guid.NewGuid().ToString();
[ObservableProperty][NotifyPropertyChangedRecipients] public partial bool IsEnabled { get; set; } = true; [ObservableProperty][NotifyPropertyChangedRecipients] public partial bool IsEnabled { get; set; } = true;
[ObservableProperty][NotifyPropertyChangedRecipients] public partial bool IsRealTimeWatchEnabled { get; set; } = false;
[ObservableProperty][NotifyPropertyChangedRecipients][NotifyPropertyChangedFor(nameof(ConnectionSummary))] public partial string Path { get; set; }
[ObservableProperty] [ObservableProperty]
[NotifyPropertyChangedRecipients] [NotifyPropertyChangedRecipients]
[NotifyPropertyChangedFor(nameof(IsLocal))] [NotifyPropertyChangedFor(nameof(IsLocal))]
[NotifyPropertyChangedFor(nameof(ConnectionSummary))] [NotifyPropertyChangedFor(nameof(ConnectionSummary))]
[NotifyPropertyChangedFor(nameof(UriString))]
public partial FileSourceType SourceType { get; set; } = FileSourceType.Local; public partial FileSourceType SourceType { get; set; } = FileSourceType.Local;
[ObservableProperty][NotifyPropertyChangedRecipients] public partial string Name { get; set; } [ObservableProperty][NotifyPropertyChangedRecipients] public partial string Name { get; set; }
[ObservableProperty] public partial string UserName { get; set; } // 连接属性
[ObservableProperty][NotifyPropertyChangedFor(nameof(UriString))] public partial string UserName { get; set; }
[ObservableProperty][NotifyPropertyChangedFor(nameof(UriString))] public partial string UriScheme { get; set; }
[ObservableProperty][NotifyPropertyChangedFor(nameof(UriString))] public partial string UriHost { get; set; }
[ObservableProperty][NotifyPropertyChangedFor(nameof(UriString))] public partial int UriPort { get; set; } = -1;
[ObservableProperty] public partial int Port { get; set; } = -1; [JsonPropertyName("Path")]
[ObservableProperty]
[NotifyPropertyChangedRecipients]
[NotifyPropertyChangedFor(nameof(ConnectionSummary))]
[NotifyPropertyChangedFor(nameof(UriString))]
public partial string UriPath { get; set; }
[JsonIgnore] public string Password { get; set; } [JsonIgnore] public string Password { get; set; }
[JsonIgnore] public bool IsLocal => SourceType == FileSourceType.Local; [JsonIgnore] public bool IsLocal => SourceType == FileSourceType.Local;
[ObservableProperty][NotifyPropertyChangedRecipients] public partial bool IsProcessing { get; set; } = false;
[ObservableProperty] public partial double IndexingProgress { get; set; } = 0;
[ObservableProperty] public partial string StatusText { get; set; } = "";
[ObservableProperty] public partial InfoBarSeverity StatusSeverity { get; set; } = InfoBarSeverity.Informational;
[ObservableProperty][NotifyPropertyChangedRecipients] public partial DateTime? LastSyncTime { get; set; }
[ObservableProperty][NotifyPropertyChangedRecipients] public partial AutoScanInterval ScanInterval { get; set; } = AutoScanInterval.Disabled;
public Uri GetStandardUri()
{
try
{
if (IsLocal)
{
return new Uri(UriPath);
}
var builder = new UriBuilder
{
Scheme = UriScheme ?? "file",
Host = UriHost,
Port = UriPort,
};
if (!string.IsNullOrEmpty(UriPath))
{
string cleanPath = UriPath.Replace("\\", "/");
if (!cleanPath.StartsWith("/")) cleanPath = "/" + cleanPath;
builder.Path = cleanPath;
}
return builder.Uri;
}
catch (Exception)
{
return new Uri("about:blank");
}
}
// 例smb://user@host:445/share/path
[JsonIgnore]
public string UriString => GetStandardUri().AbsoluteUri;
[JsonIgnore] [JsonIgnore]
public string ConnectionSummary public string ConnectionSummary
{ {
get get
{ {
if (IsLocal) return Path; if (IsLocal) return UriPath;
return $"{SourceType} - {Path} {(string.IsNullOrEmpty(UserName) ? "" : $"({UserName})")}"; return $"{UriScheme}://{UriHost}{(UriPort > 0 ? ":" + UriPort : "")}/{UriPath?.TrimStart('/', '\\')} {(string.IsNullOrEmpty(UserName) ? "" : $"({UserName})")}";
} }
} }
@@ -49,7 +101,8 @@ namespace BetterLyrics.WinUI3.Models
public MediaFolder(string path) public MediaFolder(string path)
{ {
Path = path; UriPath = path;
SourceType = FileSourceType.Local;
} }
public IUnifiedFileSystem? CreateFileSystem() public IUnifiedFileSystem? CreateFileSystem()
@@ -62,12 +115,13 @@ namespace BetterLyrics.WinUI3.Models
return SourceType switch return SourceType switch
{ {
FileSourceType.Local => new LocalFileSystem(Path), FileSourceType.Local => new LocalFileSystem(this),
FileSourceType.SMB => new SMBFileSystem(Path, UserName, Password), FileSourceType.SMB => new SMBFileSystem(this),
FileSourceType.FTP => new FTPFileSystem(Path, UserName, Password, Port, Path), FileSourceType.FTP => new FTPFileSystem(this),
FileSourceType.WebDav => new WebDavFileSystem(Path, UserName, Password, Port, Path), FileSourceType.WebDAV => new WebDavFileSystem(this),
_ => throw new NotImplementedException() _ => throw new NotImplementedException()
}; };
} }
} }
} }

View File

@@ -35,11 +35,11 @@ namespace BetterLyrics.WinUI3.Models
[ObservableProperty][NotifyPropertyChangedRecipients] public partial LyricsSearchType LyricsSearchType { get; set; } = LyricsSearchType.Sequential; [ObservableProperty][NotifyPropertyChangedRecipients] public partial LyricsSearchType LyricsSearchType { get; set; } = LyricsSearchType.Sequential;
[ObservableProperty][NotifyPropertyChangedRecipients] public partial int MatchingThreshold { get; set; } = 40; [ObservableProperty][NotifyPropertyChangedRecipients] public partial int MatchingThreshold { get; set; } = 40;
[JsonIgnore] public string LogoPath => PlayerIDHelper.GetLogoPath(Provider); [JsonIgnore] public string LogoPath => PlayerIdHelper.GetLogoPath(Provider);
[JsonIgnore] public string? DisplayName => PlayerIDHelper.GetDisplayName(Provider); [JsonIgnore] public string? DisplayName => PlayerIdHelper.GetDisplayName(Provider);
[JsonIgnore] public bool IsLXMusic => PlayerIDHelper.IsLXMusic(Provider); [JsonIgnore] public bool IsLXMusic => PlayerIdHelper.IsLXMusic(Provider);
public MediaSourceProviderInfo() public MediaSourceProviderInfo()
{ {
@@ -53,7 +53,7 @@ namespace BetterLyrics.WinUI3.Models
IsEnabled = isEnable; IsEnabled = isEnable;
switch (provider) switch (provider)
{ {
case Constants.PlayerID.AppleMusic: case Constants.PlayerId.AppleMusic:
// Apple Music 的特性 // Apple Music 的特性
TimelineSyncThreshold = 1000; TimelineSyncThreshold = 1000;
PositionOffset = 1000; PositionOffset = 1000;

View File

@@ -0,0 +1,39 @@
using Microsoft.EntityFrameworkCore;
using System;
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;
namespace BetterLyrics.WinUI3.Models
{
[Index(nameof(Title))]
[Index(nameof(Artist))]
[Index(nameof(StartedAt))] // 用于按时间排序查询(如:最近播放)
[Index(nameof(PlayerId))]
public class PlayHistoryItem
{
[Key]
[DatabaseGenerated(DatabaseGeneratedOption.Identity)] // AutoIncrement
public int Id { get; set; }
// 注意:作为索引列,必须加 MaxLength。
// 如果不加,默认为 nvarchar(max)SQL Server 无法对其建立高效索引。
[MaxLength(450)]
public string Title { get; set; } = "";
[MaxLength(450)]
public string Artist { get; set; } = "";
// Album 没有索引,可以不限制长度,或者为了规范也限制一下
public string Album { get; set; } = "";
public DateTime StartedAt { get; set; }
public double DurationPlayedMs { get; set; }
public double TotalDurationMs { get; set; }
// PlayerId 通常是个 GUID 或者短字符串,给 100 长度通常足够了,节省索引空间
[MaxLength(100)]
public string PlayerId { get; set; } = "";
}
}

View File

@@ -0,0 +1,15 @@
using BetterLyrics.WinUI3.Helper;
using System;
using System.Collections.Generic;
using System.Text;
namespace BetterLyrics.WinUI3.Models
{
public class PlayerStatDisplayItem
{
public string PlayerId { get; set; }
public int PlayCount { get; set; }
public string PlayerName => PlayerIdHelper.GetDisplayName(PlayerId);
}
}

View File

@@ -6,37 +6,18 @@ namespace BetterLyrics.WinUI3.Models
{ {
public partial class SongsTabInfo : BaseViewModel public partial class SongsTabInfo : BaseViewModel
{ {
public string Name { get; set; } public string Name { get; set; } = "";
public string Icon { get; set; } public string Icon { get; set; } = "";
public bool IsClosable { get; set; } public CommonSongProperty FilterProperty { get; set; } = CommonSongProperty.Title;
[ObservableProperty] public string FilterValue { get; set; } = "";
public partial bool IsStarred { get; set; }
public CommonSongProperty FilterProperty { get; set; } public bool IsDefault => Icon == "\uE8A9";
public string FilterValue { get; set; }
public SongsTabInfo() public SongsTabInfo()
{ {
Name = string.Empty;
Icon = string.Empty;
IsClosable = true;
IsStarred = false;
FilterProperty = CommonSongProperty.Title;
FilterValue = string.Empty;
}
public SongsTabInfo(string name, string icon, bool isClosable, bool isStarred, CommonSongProperty filterProperty, string filterValue)
{
Name = name;
Icon = icon;
IsClosable = isClosable;
IsStarred = isStarred;
FilterProperty = filterProperty;
FilterValue = filterValue;
} }
} }
} }

View File

@@ -0,0 +1,13 @@
using System;
using System.Collections.Generic;
using System.Text;
namespace BetterLyrics.WinUI3.Models.Stats
{
public class ArtistPlayCount
{
public string Artist { get; set; }
public int PlayCount { get; set; }
public double TotalDurationSeconds { get; set; }
}
}

View File

@@ -0,0 +1,16 @@
using System;
using System.Collections.Generic;
using System.Text;
namespace BetterLyrics.WinUI3.Models.Stats
{
public class PlayerStats
{
public string PlayerId { get; set; }
public int Count { get; set; }
public double DisplayWidth => (TotalCount > 0) ? (Count / (double)TotalCount) * 150 : 0;
public int TotalCount { get; set; }
}
}

View File

@@ -0,0 +1,13 @@
using System;
using System.Collections.Generic;
using System.Text;
namespace BetterLyrics.WinUI3.Models.Stats
{
public class SongPlayCount
{
public string Title { get; set; }
public string Artist { get; set; }
public int PlayCount { get; set; }
}
}

View File

@@ -1,14 +0,0 @@
namespace BetterLyrics.WinUI3.Models
{
public class TrimmedTrack
{
public string Title { get; set; }
public string Artist { get; set; }
public string Album { get; set; }
public int? Year { get; set; }
public string Genre { get; set; }
public string FilePath { get; set; }
public int Duration { get; set; }
public byte[]? AlbumArt { get; set; }
}
}

View File

@@ -1,6 +1,7 @@
using BetterLyrics.WinUI3.Enums; using BetterLyrics.WinUI3.Enums;
using BetterLyrics.WinUI3.Helper; using BetterLyrics.WinUI3.Helper;
using BetterLyrics.WinUI3.Models; using BetterLyrics.WinUI3.Models;
using BetterLyrics.WinUI3.Services.FileSystemService;
using BetterLyrics.WinUI3.Services.SettingsService; using BetterLyrics.WinUI3.Services.SettingsService;
using Microsoft.Extensions.Logging; using Microsoft.Extensions.Logging;
using System; using System;
@@ -22,11 +23,13 @@ namespace BetterLyrics.WinUI3.Services.AlbumArtSearchService
private readonly HttpClient _iTunesHttpClinet; private readonly HttpClient _iTunesHttpClinet;
private readonly ISettingsService _settingsService; private readonly ISettingsService _settingsService;
private readonly IFileSystemService _fileSystemService;
private readonly ILogger _logger; private readonly ILogger _logger;
public AlbumArtSearchService(ISettingsService settingsService, ILogger<AlbumArtSearchService> logger) public AlbumArtSearchService(ISettingsService settingsService, IFileSystemService fileSystemService, ILogger<AlbumArtSearchService> logger)
{ {
_settingsService = settingsService; _settingsService = settingsService;
_fileSystemService = fileSystemService;
_logger = logger; _logger = logger;
_iTunesHttpClinet = new(); _iTunesHttpClinet = new();
} }
@@ -77,70 +80,54 @@ namespace BetterLyrics.WinUI3.Services.AlbumArtSearchService
private async Task<byte[]?> SearchFile(SongInfo songInfo) private async Task<byte[]?> SearchFile(SongInfo songInfo)
{ {
foreach (var folder in _settingsService.AppSettings.LocalMediaFolders) var enabledIds = _settingsService.AppSettings.LocalMediaFolders
.Where(f => f.IsEnabled)
.Select(f => f.Id)
.ToList();
if (enabledIds.Count == 0) return null;
var allFiles = await _fileSystemService.GetParsedFilesAsync(enabledIds);
allFiles = allFiles.Where(x => FileHelper.MusicExtensions.Contains(Path.GetExtension(x.FileName))).ToList();
FilesIndexItem? bestMatch = null;
foreach (var item in allFiles)
{ {
if (!folder.IsEnabled) continue; var ext = Path.GetExtension(item.FileName).ToLower();
if (!FileHelper.MusicExtensions.Contains(ext)) continue;
try bool isMetadataMatch = (item.Title == songInfo.Title && item.Artists == songInfo.DisplayArtists);
bool isFilenameMatch = StringHelper.IsSwitchableNormalizedMatch(
Path.GetFileNameWithoutExtension(item.FileName),
songInfo.DisplayArtists,
songInfo.Title
);
if (isMetadataMatch || isFilenameMatch)
{ {
using var fs = folder.CreateFileSystem(); bestMatch = item;
if (fs == null) continue; break;
if (!await fs.ConnectAsync()) continue;
// 递归扫描
var foldersToScan = new Queue<string>();
foldersToScan.Enqueue(""); // 根目录
while (foldersToScan.Count > 0)
{
var currentPath = foldersToScan.Dequeue();
var items = await fs.GetFilesAsync(currentPath);
foreach (var item in items)
{
if (item.IsFolder)
{
foldersToScan.Enqueue(Path.Combine(currentPath, item.Name));
continue;
}
var ext = Path.GetExtension(item.Name).ToLower();
if (FileHelper.MusicExtensions.Contains(ext))
{
try
{
using (var stream = await fs.OpenReadAsync(item.FullPath))
{
var track = new ExtendedTrack(item.FullPath, stream);
bool isMetadataMatch = (track.Title == songInfo.Title && track.Artist == songInfo.DisplayArtists);
bool isFilenameMatch = StringHelper.IsSwitchableNormalizedMatch(
Path.GetFileNameWithoutExtension(item.Name),
songInfo.DisplayArtists,
songInfo.Title
);
if (isMetadataMatch || isFilenameMatch)
{
var bytes = track.EmbeddedPictures.FirstOrDefault()?.PictureData;
if (bytes != null && bytes.Length > 0)
{
return bytes;
}
}
}
}
catch
{
}
}
}
}
} }
catch }
if (bestMatch == null || string.IsNullOrEmpty(bestMatch.LocalAlbumArtPath))
{
return null;
}
try
{
if (File.Exists(bestMatch.LocalAlbumArtPath))
{ {
return await File.ReadAllBytesAsync(bestMatch.LocalAlbumArtPath);
} }
} }
catch (Exception ex)
{
System.Diagnostics.Debug.WriteLine($"读取本地缓存失败: {ex.Message}");
}
return null; return null;
} }

View File

@@ -0,0 +1,596 @@
using BetterLyrics.WinUI3.Enums;
using BetterLyrics.WinUI3.Helper;
using BetterLyrics.WinUI3.Models;
using BetterLyrics.WinUI3.Models.Db;
using BetterLyrics.WinUI3.Services.FileSystemService.Providers;
using BetterLyrics.WinUI3.Services.LocalizationService;
using BetterLyrics.WinUI3.Services.SettingsService;
using BetterLyrics.WinUI3.ViewModels;
using CommunityToolkit.Mvvm.Messaging;
using CommunityToolkit.Mvvm.Messaging.Messages;
using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.Logging;
using Microsoft.UI.Xaml.Controls;
using System;
using System.Collections.Concurrent;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Threading;
using System.Threading.Tasks;
namespace BetterLyrics.WinUI3.Services.FileSystemService
{
public partial class FileSystemService : BaseViewModel, IFileSystemService,
IRecipient<PropertyChangedMessage<AutoScanInterval>>,
IRecipient<PropertyChangedMessage<bool>>
{
private readonly ISettingsService _settingsService;
private readonly ILocalizationService _localizationService;
private readonly ILogger<FileSystemService> _logger;
private readonly IDbContextFactory<FilesIndexDbContext> _contextFactory;
private bool _isInitialized = false;
// 定时器字典
private readonly ConcurrentDictionary<string, CancellationTokenSource> _folderTimerTokens = new();
// 当前正在执行的扫描任务字典
private readonly ConcurrentDictionary<string, CancellationTokenSource> _activeScanTokens = new();
private static readonly SemaphoreSlim _folderScanLock = new(1, 1);
public FileSystemService(
ISettingsService settingsService,
ILocalizationService localizationService,
ILogger<FileSystemService> logger,
IDbContextFactory<FilesIndexDbContext> contextFactory)
{
_logger = logger;
_localizationService = localizationService;
_settingsService = settingsService;
_contextFactory = contextFactory;
}
public async Task<List<FilesIndexItem>> GetFilesAsync(IUnifiedFileSystem provider, FilesIndexItem? parentFolder, string configId, bool forceRefresh = false)
{
string queryParentUri = parentFolder == null ? "" : parentFolder.Uri;
if (parentFolder == null && !forceRefresh) forceRefresh = true;
using var context = await _contextFactory.CreateDbContextAsync();
var cachedEntities = await context.FilesIndex
.AsNoTracking() // 读操作不追踪,提升性能
.Where(x => x.MediaFolderId == configId && x.ParentUri == queryParentUri)
.ToListAsync();
bool needSync = forceRefresh || cachedEntities.Count == 0;
if (needSync)
{
// SyncAsync 内部自己管理 Context
cachedEntities = await SyncAsync(provider, parentFolder, configId);
}
return cachedEntities;
}
/// <summary>
/// 从远端/本地同步文件至数据库
/// </summary>
private async Task<List<FilesIndexItem>> SyncAsync(IUnifiedFileSystem provider, FilesIndexItem? parentFolder, string configId)
{
List<FilesIndexItem> remoteItems;
try
{
remoteItems = await provider.GetFilesAsync(parentFolder);
}
catch (Exception ex)
{
System.Diagnostics.Debug.WriteLine($"Network sync error: {ex.Message}");
return [];
}
if (remoteItems == null) return [];
string targetParentUri = "";
if (remoteItems.Count > 0)
targetParentUri = remoteItems[0].ParentUri ?? "";
else if (parentFolder != null)
targetParentUri = parentFolder.Uri;
else
return [];
try
{
using var context = await _contextFactory.CreateDbContextAsync();
// 开启事务 (EF Core 也能管理事务)
using var transaction = await context.Database.BeginTransactionAsync();
// 1. 获取数据库中现有的该目录下的文件
var dbItems = await context.FilesIndex
.Where(x => x.MediaFolderId == configId && x.ParentUri == targetParentUri)
.ToListAsync();
var dbMap = dbItems.ToDictionary(x => x.Uri, x => x);
// 2. 远端数据去重(防止 Provider 返回重复 Uri
var remoteDistinct = remoteItems
.GroupBy(x => x.Uri)
.Select(g => g.First())
.ToList();
var remoteUris = new HashSet<string>();
// 3. 处理 新增 和 更新
foreach (var remote in remoteDistinct)
{
remoteUris.Add(remote.Uri);
if (dbMap.TryGetValue(remote.Uri, out var existing))
{
// 检查是否变更
bool isChanged = existing.FileSize != remote.FileSize ||
existing.LastModified != remote.LastModified;
if (isChanged)
{
existing.FileSize = remote.FileSize;
existing.LastModified = remote.LastModified;
existing.IsMetadataParsed = false; // 标记重新解析
// EF Core 自动追踪 existing 的变化,无需手动 Update
}
}
else
{
// 新增
// 注意:如果 Id 是自增的,不要手动赋值 Id除非是 Guid
context.FilesIndex.Add(remote);
}
}
// 4. 处理 删除 (数据库有,远端没有)
foreach (var dbItem in dbItems)
{
if (!remoteUris.Contains(dbItem.Uri))
{
context.FilesIndex.Remove(dbItem);
}
}
await context.SaveChangesAsync();
await transaction.CommitAsync();
// 5. 返回最新数据
// 这里的 dbItems 已经被 Update 更新了内存状态,但 Remove 的还在列表里Add 的不在列表里
// 所以最稳妥的是重新查一次,或者手动维护列表。为了准确性,重新查询 (AsNoTracking)
var finalItems = await context.FilesIndex
.AsNoTracking()
.Where(x => x.MediaFolderId == configId && x.ParentUri == targetParentUri)
.ToListAsync();
FolderUpdated?.Invoke(this, targetParentUri);
return finalItems;
}
catch (Exception ex)
{
System.Diagnostics.Debug.WriteLine($"Database sync error: {ex.Message}");
return [];
}
}
public async Task UpdateMetadataAsync(FilesIndexItem entity)
{
using var context = await _contextFactory.CreateDbContextAsync();
// 使用 EF Core 7.0+ 的 ExecuteUpdateAsync 高效更新
// 这会直接生成 UPDATE SQL不经过内存加载性能极高
await context.FilesIndex
.Where(x => x.Id == entity.Id) // 优先用 Id
.ExecuteUpdateAsync(setters => setters
.SetProperty(p => p.Title, entity.Title)
.SetProperty(p => p.Artists, entity.Artists)
.SetProperty(p => p.Album, entity.Album)
.SetProperty(p => p.Year, entity.Year)
.SetProperty(p => p.Bitrate, entity.Bitrate)
.SetProperty(p => p.SampleRate, entity.SampleRate)
.SetProperty(p => p.BitDepth, entity.BitDepth)
.SetProperty(p => p.Duration, entity.Duration)
.SetProperty(p => p.AudioFormatName, entity.AudioFormatName)
.SetProperty(p => p.AudioFormatShortName, entity.AudioFormatShortName)
.SetProperty(p => p.Encoder, entity.Encoder)
.SetProperty(p => p.EmbeddedLyrics, entity.EmbeddedLyrics)
.SetProperty(p => p.LocalAlbumArtPath, entity.LocalAlbumArtPath)
.SetProperty(p => p.IsMetadataParsed, true)
);
}
public async Task<Stream?> OpenFileAsync(IUnifiedFileSystem provider, FilesIndexItem entity)
{
return await provider.OpenReadAsync(entity);
}
public async Task DeleteCacheForMediaFolderAsync(MediaFolder folder)
{
_dispatcherQueue.TryEnqueue(() =>
{
folder.IndexingProgress = 0;
folder.StatusSeverity = InfoBarSeverity.Informational;
folder.StatusText = _localizationService.GetLocalizedString("FileSystemServicePrepareToClean");
folder.IsProcessing = true;
});
if (_folderTimerTokens.TryRemove(folder.Id, out var timerCts))
{
timerCts.Cancel();
timerCts.Dispose();
_logger.LogInformation("DeleteCacheForMediaFolderAsync: {}", "cts.Dispose();");
}
if (_activeScanTokens.TryGetValue(folder.Id, out var activeScanCts))
{
activeScanCts.Cancel();
}
try
{
await _folderScanLock.WaitAsync();
try
{
_dispatcherQueue.TryEnqueue(() =>
{
folder.StatusText = _localizationService.GetLocalizedString("FileSystemServiceCleaningCache");
});
using var context = await _contextFactory.CreateDbContextAsync();
await context.FilesIndex
.Where(x => x.MediaFolderId == folder.Id)
.ExecuteDeleteAsync();
// VACUUM 是 SQLite 特有的命令
if (context.Database.IsSqlite())
{
await context.Database.ExecuteSqlRawAsync("VACUUM");
}
}
finally
{
_folderScanLock.Release();
}
}
catch (Exception ex)
{
_logger.LogError("DeleteCacheForMediaFolderAsync: {}", ex.Message);
}
finally
{
_dispatcherQueue.TryEnqueue(() =>
{
folder.IsProcessing = false;
folder.LastSyncTime = null;
});
}
}
public async Task ScanMediaFolderAsync(MediaFolder folder, CancellationToken token = default)
{
if (folder == null || !folder.IsEnabled) return;
using var scanCts = CancellationTokenSource.CreateLinkedTokenSource(token);
_activeScanTokens[folder.Id] = scanCts;
_dispatcherQueue.TryEnqueue(() =>
{
folder.StatusSeverity = InfoBarSeverity.Informational;
folder.IsProcessing = true;
folder.IndexingProgress = 0;
folder.StatusText = _localizationService.GetLocalizedString("FileSystemServiceWaitingForScan");
});
try
{
await _folderScanLock.WaitAsync(scanCts.Token);
_dispatcherQueue.TryEnqueue(() => folder.StatusText = _localizationService.GetLocalizedString("FileSystemServiceConnecting"));
using var fs = folder.CreateFileSystem();
if (fs == null || !await fs.ConnectAsync())
{
_dispatcherQueue.TryEnqueue(() =>
{
folder.StatusSeverity = InfoBarSeverity.Error;
folder.StatusText = _localizationService.GetLocalizedString("FileSystemServiceConnectFailed");
});
return;
}
_dispatcherQueue.TryEnqueue(() => folder.StatusText = _localizationService.GetLocalizedString("FileSystemServiceFetchingFileList"));
var filesToProcess = new List<FilesIndexItem>();
var foldersToScan = new Queue<FilesIndexItem?>();
foldersToScan.Enqueue(null); // 根目录
while (foldersToScan.Count > 0)
{
if (scanCts.Token.IsCancellationRequested) return;
var currentParent = foldersToScan.Dequeue();
var items = await GetFilesAsync(fs, currentParent, folder.Id, forceRefresh: true);
foreach (var item in items)
{
if (item.IsDirectory)
{
foldersToScan.Enqueue(item);
}
else
{
var ext = Path.GetExtension(item.FileName).ToLower();
if (FileHelper.AllSupportedExtensions.Contains(ext))
{
filesToProcess.Add(item);
}
}
}
}
int total = filesToProcess.Count;
int current = 0;
foreach (var item in filesToProcess)
{
if (scanCts.Token.IsCancellationRequested) return;
current++;
if (current % 10 == 0 || current == total)
{
double progress = (double)current / total * 100;
_dispatcherQueue.TryEnqueue(() =>
{
folder.IndexingProgress = progress;
folder.StatusText = $"{_localizationService.GetLocalizedString("FileSystemServiceParsing")} {current}/{total}";
});
}
if (item.IsMetadataParsed) continue;
var ext = Path.GetExtension(item.FileName).ToLower();
try
{
if (FileHelper.MusicExtensions.Contains(ext))
{
using var originalStream = await OpenFileAsync(fs, item);
if (originalStream == null) continue;
ExtendedTrack track;
if (originalStream.CanSeek)
{
track = new ExtendedTrack(item, originalStream);
}
else
{
using var memStream = new MemoryStream();
await originalStream.CopyToAsync(memStream, scanCts.Token);
memStream.Position = 0;
track = new ExtendedTrack(item, memStream);
}
if (track.Duration > 0)
{
string? artPath = await SaveAlbumArtToDiskAsync(track);
item.Title = track.Title;
item.Artists = track.Artist;
item.Album = track.Album;
item.Year = track.Year;
item.Bitrate = track.Bitrate;
item.SampleRate = track.SampleRate;
item.BitDepth = track.BitDepth;
item.Duration = track.Duration;
item.AudioFormatName = track.AudioFormatName;
item.AudioFormatShortName = track.AudioFormatShortName;
item.Encoder = track.Encoder;
item.EmbeddedLyrics = track.RawLyrics;
item.LocalAlbumArtPath = artPath;
item.IsMetadataParsed = true;
}
}
else if (FileHelper.LyricExtensions.Contains(ext))
{
using var stream = await OpenFileAsync(fs, item);
if (stream != null)
{
using var reader = new StreamReader(stream);
string content = await reader.ReadToEndAsync();
item.EmbeddedLyrics = content;
item.IsMetadataParsed = true;
}
}
if (item.IsMetadataParsed)
{
// 更新操作:直接调用 UpdateMetadataAsync
// 此时不需要 _dbLock因为 UpdateMetadataAsync 内部会 CreateDbContextAsync
// 而 _folderScanLock 已经保证了当前文件夹扫描的独占性
await UpdateMetadataAsync(item);
}
}
catch (Exception ex)
{
_logger.LogError("ScanMediaFolderAsync: {}", ex.Message);
}
}
_dispatcherQueue.TryEnqueue(() =>
{
folder.StatusSeverity = InfoBarSeverity.Success;
folder.StatusText = _localizationService.GetLocalizedString("FileSystemServiceReady");
folder.LastSyncTime = DateTime.Now;
});
}
catch (OperationCanceledException)
{
// 正常取消
}
catch (Exception ex)
{
_dispatcherQueue.TryEnqueue(() =>
{
folder.StatusText = ex.Message;
folder.StatusSeverity = InfoBarSeverity.Error;
});
}
finally
{
_folderScanLock.Release();
_activeScanTokens.TryRemove(folder.Id, out _);
_dispatcherQueue.TryEnqueue(() =>
{
folder.IsProcessing = false;
folder.IndexingProgress = 0;
});
}
}
public async Task<List<FilesIndexItem>> GetParsedFilesAsync(IEnumerable<string> enabledConfigIds)
{
if (enabledConfigIds == null || !enabledConfigIds.Any())
{
return new List<FilesIndexItem>();
}
var idList = enabledConfigIds.ToList();
using var context = await _contextFactory.CreateDbContextAsync();
// SQL: SELECT * FROM FileCache WHERE IsMetadataParsed = 1 AND MediaFolderId IN (...)
return await context.FilesIndex
.AsNoTracking()
.Where(x => x.IsMetadataParsed && idList.Contains(x.MediaFolderId))
.ToListAsync();
}
public void StartAllFolderTimers()
{
foreach (var folder in _settingsService.AppSettings.LocalMediaFolders)
{
if (folder.IsEnabled)
{
UpdateFolderTimer(folder);
}
}
}
private void UpdateFolderTimer(MediaFolder folder)
{
if (_folderTimerTokens.TryRemove(folder.Id, out var oldCts))
{
oldCts.Cancel();
oldCts.Dispose();
}
if (!folder.IsEnabled || folder.ScanInterval == AutoScanInterval.Disabled)
{
return;
}
var newCts = new CancellationTokenSource();
_folderTimerTokens[folder.Id] = newCts;
TimeSpan period = folder.ScanInterval switch
{
AutoScanInterval.Every15Minutes => TimeSpan.FromMinutes(15),
AutoScanInterval.EveryHour => TimeSpan.FromHours(1),
AutoScanInterval.Every6Hours => TimeSpan.FromHours(6),
AutoScanInterval.Daily => TimeSpan.FromDays(1),
_ => TimeSpan.FromHours(1)
};
Task.Run(async () =>
{
try
{
using var timer = new PeriodicTimer(period);
while (await timer.WaitForNextTickAsync(newCts.Token))
{
await ScanMediaFolderAsync(folder, newCts.Token);
}
}
catch (OperationCanceledException)
{
}
catch (Exception ex)
{
System.Diagnostics.Debug.WriteLine($"文件夹 {folder.Name} 定时扫描出错: {ex.Message}");
}
}, newCts.Token);
}
public event EventHandler<string>? FolderUpdated;
private async Task<string?> SaveAlbumArtToDiskAsync(ExtendedTrack track)
{
// 代码未变,纯 IO 操作
var picData = track.AlbumArtByteArray;
if (picData == null || picData.Length == 0) return null;
try
{
string hash = ComputeHashForBytes(picData);
string safeName = hash + ".jpg";
string localPath = Path.Combine(PathHelper.LocalAlbumArtCacheDirectory, safeName);
if (File.Exists(localPath)) return localPath;
await File.WriteAllBytesAsync(localPath, picData);
return localPath;
}
catch (Exception)
{
return null;
}
}
private string ComputeHashForBytes(byte[] data)
{
using (var md5 = System.Security.Cryptography.MD5.Create())
{
var hashBytes = md5.ComputeHash(data);
return BitConverter.ToString(hashBytes).Replace("-", "").ToLowerInvariant();
}
}
public void Receive(PropertyChangedMessage<AutoScanInterval> message)
{
if (message.Sender is MediaFolder mediaFolder)
{
if (message.PropertyName == nameof(MediaFolder.ScanInterval))
{
UpdateFolderTimer(mediaFolder);
}
}
}
public void Receive(PropertyChangedMessage<bool> message)
{
if (message.Sender is MediaFolder mediaFolder)
{
if (message.PropertyName == nameof(MediaFolder.IsEnabled))
{
UpdateFolderTimer(mediaFolder);
}
}
}
}
}

View File

@@ -0,0 +1,63 @@
using BetterLyrics.WinUI3.Models;
using BetterLyrics.WinUI3.Services.FileSystemService.Providers;
using System;
using System.Collections.Generic;
using System.IO;
using System.Threading;
using System.Threading.Tasks;
namespace BetterLyrics.WinUI3.Services.FileSystemService
{
public interface IFileSystemService
{
/// <summary>
/// 从数据库拉取文件(必要时需要从远端/本地同步至数据库)
/// </summary>
/// <param name="provider"></param>
/// <param name="parentFolder"></param>
/// <param name="configId"></param>
/// <param name="forceRefresh">强制需要从远端/本地同步至数据库</param>
/// <returns></returns>
Task<List<FilesIndexItem>> GetFilesAsync(IUnifiedFileSystem provider, FilesIndexItem? parentFolder, string configId, bool forceRefresh = false);
/// <summary>
/// 打开文件(通过远端/本地流)
/// </summary>
/// <param name="provider"></param>
/// <param name="entity"></param>
/// <returns></returns>
Task<Stream?> OpenFileAsync(IUnifiedFileSystem provider, FilesIndexItem entity);
/// <summary>
/// 更新数据库(单个文件)
/// </summary>
/// <param name="entity"></param>
/// <returns></returns>
Task UpdateMetadataAsync(FilesIndexItem entity);
/// <summary>
/// 从数据库删除
/// </summary>
/// <param name="folder"></param>
/// <returns></returns>
Task DeleteCacheForMediaFolderAsync(MediaFolder folder);
/// <summary>
/// 从数据库拉取文件(必要时需要从远端/本地同步至数据库)。对于需要解析的文件,打开流填充元数据并回写至数据库。
/// </summary>
/// <param name="folder"></param>
/// <returns></returns>
Task ScanMediaFolderAsync(MediaFolder folder, CancellationToken token = default);
/// <summary>
/// 从数据库拉取
/// </summary>
/// <param name="enabledConfigIds"></param>
/// <returns></returns>
Task<List<FilesIndexItem>> GetParsedFilesAsync(IEnumerable<string> enabledConfigIds);
void StartAllFolderTimers();
event EventHandler<string> FolderUpdated;
}
}

View File

@@ -0,0 +1,26 @@
using BetterLyrics.WinUI3.Models;
using System;
using System.Collections.Generic;
using System.IO;
using System.Threading.Tasks;
namespace BetterLyrics.WinUI3.Services.FileSystemService
{
public interface IUnifiedFileSystem : IDisposable
{
Task<bool> ConnectAsync();
/// <summary>
/// 从流拉取
/// </summary>
/// <param name="parentFolder"></param>
/// <returns></returns>
Task<List<FilesIndexItem>> GetFilesAsync(FilesIndexItem? parentFolder = null);
/// <summary>
/// 打开流
/// </summary>
/// <param name="file"></param>
/// <returns></returns>
Task<Stream?> OpenReadAsync(FilesIndexItem file);
Task DisconnectAsync();
}
}

View File

@@ -0,0 +1,169 @@
using BetterLyrics.WinUI3.Helper;
using BetterLyrics.WinUI3.Models;
using FluentFTP;
using System;
using System.Collections.Generic;
using System.IO;
using System.Net; // 用于 WebUtility.UrlDecode
using System.Text; // ★ 修复 Encoding 报错的关键
using System.Threading.Tasks;
namespace BetterLyrics.WinUI3.Services.FileSystemService.Providers
{
public partial class FTPFileSystem : IUnifiedFileSystem
{
private readonly AsyncFtpClient _client;
private readonly MediaFolder _config;
public FTPFileSystem(MediaFolder config)
{
_config = config ?? throw new ArgumentNullException(nameof(config));
var ftpConfig = new FtpConfig
{
ConnectTimeout = 5000,
DataConnectionConnectTimeout = 5000,
ReadTimeout = 10000,
// 忽略证书错误
ValidateAnyCertificate = true
};
int port = _config.UriPort > 0 ? _config.UriPort : 0;
_client = new AsyncFtpClient(
_config.UriHost,
_config.UserName ?? "anonymous",
_config.Password ?? "",
port,
ftpConfig
);
}
public async Task<bool> ConnectAsync()
{
if (_client.IsConnected) return true;
await _client.AutoConnect(); // AutoConnect 会自动尝试 FTP/FTPS
return _client.IsConnected;
}
public async Task<List<FilesIndexItem>> GetFilesAsync(FilesIndexItem? parentFolder = null)
{
var result = new List<FilesIndexItem>();
string targetServerPath;
Uri parentUri;
if (parentFolder == null)
{
var rootUri = _config.GetStandardUri();
targetServerPath = rootUri.AbsolutePath;
parentUri = rootUri;
}
else
{
targetServerPath = GetServerPathFromUri(parentFolder.Uri);
parentUri = new Uri(parentFolder.Uri);
}
targetServerPath = WebUtility.UrlDecode(targetServerPath).Replace("\\", "/");
if (string.IsNullOrEmpty(targetServerPath)) targetServerPath = "/";
try
{
var items = await _client.GetListing(targetServerPath, FtpListOption.Auto);
string baseUriSchema = $"{parentUri.Scheme}://{parentUri.Host}";
if (parentUri.Port > 0) baseUriSchema += $":{parentUri.Port}";
foreach (var item in items)
{
// 跳过 . 和 ..
if (item.Name == "." || item.Name == "..") continue;
// 只处理文件和文件夹
if (item.Type != FtpObjectType.File && item.Type != FtpObjectType.Directory) continue;
// 只处理特定后缀文件
if (item.Type == FtpObjectType.File)
{
string extension = Path.GetExtension(item.Name);
if (string.IsNullOrEmpty(extension) || !FileHelper.AllSupportedExtensions.Contains(extension)) continue;
}
var builder = new UriBuilder(baseUriSchema)
{
Path = item.FullName
};
result.Add(new FilesIndexItem
{
MediaFolderId = _config.Id,
// 如果是根目录扫描ParentUri 用 Config 的;否则用传入文件夹的
ParentUri = parentFolder?.Uri ?? _config.GetStandardUri().AbsoluteUri,
Uri = builder.Uri.AbsoluteUri, // 标准化 URI
FileName = item.Name,
IsDirectory = item.Type == FtpObjectType.Directory,
FileSize = item.Size,
// 防止某些服务器返回 MinValue
LastModified = item.Modified == DateTime.MinValue ? DateTime.Now : item.Modified,
IsMetadataParsed = false
});
}
}
catch (Exception ex)
{
System.Diagnostics.Debug.WriteLine($"FTP列表获取失败: {targetServerPath} - {ex.Message}");
}
return result;
}
public async Task<Stream?> OpenReadAsync(FilesIndexItem file)
{
if (file == null) return null;
try
{
// 1. 还原服务器路径
string serverPath = GetServerPathFromUri(file.Uri);
// 2. 解码 (Uri 里的空格是 %20FTP 需要真实空格)
serverPath = WebUtility.UrlDecode(serverPath);
// 3. 返回流
// 注意FluentFTP 的 OpenRead 依赖于连接保持活跃
return await _client.OpenRead(serverPath);
}
catch (Exception ex)
{
System.Diagnostics.Debug.WriteLine($"打开文件流失败: {file.FileName} - {ex.Message}");
return null;
}
}
public async Task DisconnectAsync()
{
if (_client.IsConnected)
{
await _client.Disconnect();
}
}
public void Dispose()
{
_client?.Dispose();
GC.SuppressFinalize(this);
}
// 私有辅助方法
private string GetServerPathFromUri(string uriString)
{
var uri = new Uri(uriString);
return uri.AbsolutePath; // 这里拿到的比如是 "/Music/Song%201.mp3"
}
}
}

View File

@@ -0,0 +1,119 @@
using BetterLyrics.WinUI3.Helper;
using BetterLyrics.WinUI3.Models;
using System;
using System.Collections.Generic;
using System.IO;
using System.Threading.Tasks;
namespace BetterLyrics.WinUI3.Services.FileSystemService.Providers
{
public partial class LocalFileSystem : IUnifiedFileSystem
{
private readonly MediaFolder _config;
private readonly string _rootLocalPath;
public LocalFileSystem(MediaFolder config)
{
_config = config ?? throw new ArgumentNullException(nameof(config));
_rootLocalPath = config.UriPath;
}
public Task<bool> ConnectAsync()
{
var isExisted = Directory.Exists(_rootLocalPath);
if (isExisted)
{
return Task.FromResult(true);
}
else
{
throw new FileNotFoundException(null, _rootLocalPath);
}
}
public async Task<List<FilesIndexItem>> GetFilesAsync(FilesIndexItem? parentFolder = null)
{
var result = new List<FilesIndexItem>();
string targetPath;
string parentUriString;
try
{
if (parentFolder == null)
{
targetPath = _rootLocalPath;
parentUriString = _config.GetStandardUri().AbsoluteUri;
}
else
{
var uri = new Uri(parentFolder.Uri);
targetPath = uri.LocalPath;
parentUriString = parentFolder.Uri;
}
if (!Directory.Exists(targetPath)) return result;
var dirInfo = new DirectoryInfo(targetPath);
foreach (var item in dirInfo.EnumerateFileSystemInfos())
{
// 跳过系统/隐藏文件
if ((item.Attributes & FileAttributes.Hidden) != 0 || (item.Attributes & FileAttributes.System) != 0) continue;
bool isDir = (item.Attributes & FileAttributes.Directory) == FileAttributes.Directory;
if (!isDir)
{
// 过滤后缀名
if (string.IsNullOrEmpty(item.Extension) || !FileHelper.AllSupportedExtensions.Contains(item.Extension)) continue;
}
var itemUri = new Uri(item.FullName).AbsoluteUri;
long size = 0;
if (!isDir && item is FileInfo fi)
{
size = fi.Length;
}
result.Add(new FilesIndexItem
{
MediaFolderId = _config.Id, // 关联配置 ID
ParentUri = parentUriString, // 记录父级 URI
Uri = itemUri,
FileName = item.Name,
IsDirectory = isDir,
FileSize = size,
LastModified = item.LastWriteTime
});
}
}
catch (Exception ex)
{
System.Diagnostics.Debug.WriteLine($"Local scan error: {ex.Message}");
}
return await Task.FromResult(result);
}
public async Task<Stream?> OpenReadAsync(FilesIndexItem entity)
{
if (entity == null) return null;
string localPath = new Uri(entity.Uri).LocalPath;
// 使用 FileShare.Read 允许其他程序同时读取
// 使用 useAsync: true 优化异步读写性能
return new FileStream(localPath, FileMode.Open, FileAccess.Read, FileShare.Read, 4096, true);
}
public async Task DisconnectAsync() => await Task.CompletedTask;
public void Dispose() { }
}
}

View File

@@ -0,0 +1,204 @@
using BetterLyrics.WinUI3.Helper;
using BetterLyrics.WinUI3.Models;
using SMBLibrary;
using SMBLibrary.Client;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Threading.Tasks;
namespace BetterLyrics.WinUI3.Services.FileSystemService.Providers
{
public partial class SMBFileSystem : IUnifiedFileSystem
{
private SMB2Client? _client;
private ISMBFileStore? _fileStore;
// 保存配置对象的引用
private readonly MediaFolder _config;
// 缓存解析出来的 Share 名称,因为 TreeConnect 要用
private string _shareName;
public SMBFileSystem(MediaFolder config)
{
_config = config ?? throw new ArgumentNullException(nameof(config));
// 在构造时就解析好 Share 名称,避免后续重复解析
var uri = _config.GetStandardUri();
// Segments[0] 是 "/", Segments[1] 是 "ShareName/"
if (uri.Segments.Length > 1)
{
_shareName = uri.Segments[1].TrimEnd('/');
}
else
{
// 如果没有 ShareName这在 SMB 中通常是不合法的,但在根目录下可能发生
_shareName = "";
}
}
public async Task<bool> ConnectAsync()
{
_client = new SMB2Client();
// 连接主机
bool connected = _client.Connect(_config.UriHost, SMBTransportType.DirectTCPTransport);
if (!connected) return false;
// 登录
var status = _client.Login(string.Empty, _config.UserName, _config.Password);
if (status != NTStatus.STATUS_SUCCESS) return false;
// 连接共享目录 (TreeConnect)
// SMBLibrary 必须先连接到 Share后续所有文件操作都是基于这个 Share 的相对路径
if (string.IsNullOrEmpty(_shareName)) return false;
_fileStore = _client.TreeConnect(_shareName, out status);
return status == NTStatus.STATUS_SUCCESS;
}
/// <summary>
/// 获取文件列表
/// </summary>
/// <param name="parentFolder">
/// 传入要列出的文件夹实体。
/// 如果传入 null则默认列出 MediaFolder 配置的根目录。
/// </param>
public async Task<List<FilesIndexItem>> GetFilesAsync(FilesIndexItem? parentFolder = null)
{
var result = new List<FilesIndexItem>();
if (_fileStore == null) return result;
string smbPath = GetPathRelativeToShare(parentFolder);
var statusRet = _fileStore.CreateFile(out object handle, out FileStatus status, smbPath,
AccessMask.GENERIC_READ, SMBLibrary.FileAttributes.Directory, ShareAccess.Read,
CreateDisposition.FILE_OPEN, CreateOptions.FILE_DIRECTORY_FILE, null);
if (statusRet != NTStatus.STATUS_SUCCESS) return result;
string parentUriString = parentFolder?.Uri ?? _config.GetStandardUri().AbsoluteUri;
List<QueryDirectoryFileInformation> fileInfo;
do
{
statusRet = _fileStore.QueryDirectory(out fileInfo, handle, "*", FileInformationClass.FileDirectoryInformation);
// 如果查询失败或者没有更多文件fileInfo 可能是 null直接跳出
if (statusRet != NTStatus.STATUS_SUCCESS && statusRet != NTStatus.STATUS_NO_MORE_FILES)
{
break;
}
// 如果是 NO_MORE_FILES 但 fileInfo 依然有残留数据(极少见),或者是 SUCCESS
if (fileInfo != null)
{
foreach (var item in fileInfo.Cast<FileDirectoryInformation>())
{
if (item.FileName == "." || item.FileName == "..") continue;
// 过滤隐藏文件和系统文件
if ((item.FileAttributes & SMBLibrary.FileAttributes.Hidden) == SMBLibrary.FileAttributes.Hidden ||
(item.FileAttributes & SMBLibrary.FileAttributes.System) == SMBLibrary.FileAttributes.System)
{
continue;
}
bool isDir = (item.FileAttributes & SMBLibrary.FileAttributes.Directory) == SMBLibrary.FileAttributes.Directory;
// 后缀名过滤
if (!isDir)
{
string extension = Path.GetExtension(item.FileName);
if (string.IsNullOrEmpty(extension) || !FileHelper.AllSupportedExtensions.Contains(extension)) continue;
}
if (!parentUriString.EndsWith("/")) parentUriString += "/";
var baseUri = new Uri(parentUriString);
var newUri = new Uri(baseUri, item.FileName);
result.Add(new FilesIndexItem
{
MediaFolderId = _config.Id,
ParentUri = parentFolder?.Uri ?? _config.GetStandardUri().AbsoluteUri,
Uri = newUri.AbsoluteUri,
FileName = item.FileName,
IsDirectory = (item.FileAttributes & SMBLibrary.FileAttributes.Directory) == SMBLibrary.FileAttributes.Directory,
FileSize = item.AllocationSize,
LastModified = item.ChangeTime
});
}
}
if (statusRet == NTStatus.STATUS_NO_MORE_FILES) break;
} while (statusRet == NTStatus.STATUS_SUCCESS);
_fileStore.CloseFile(handle);
return result;
}
/// <summary>
/// 打开文件流
/// </summary>
/// <param name="file">只需要传入文件实体即可</param>
public async Task<Stream?> OpenReadAsync(FilesIndexItem file)
{
if (_fileStore == null || file == null) return null;
string smbPath = GetPathRelativeToShare(file);
var ret = _fileStore.CreateFile(out object handle, out FileStatus status, smbPath,
AccessMask.GENERIC_READ | AccessMask.SYNCHRONIZE, 0, ShareAccess.Read, CreateDisposition.FILE_OPEN, 0, null);
if (ret != NTStatus.STATUS_SUCCESS)
throw new IOException($"SMB Open Error: {ret}");
return new SMBReadOnlyStream(_fileStore, handle);
}
public async Task DisconnectAsync()
{
_client?.Disconnect();
await Task.CompletedTask;
}
public void Dispose()
{
_client?.Disconnect();
}
private string GetPathRelativeToShare(FilesIndexItem? entity)
{
Uri targetUri;
if (entity == null)
{
targetUri = _config.GetStandardUri();
}
else
{
targetUri = new Uri(entity.Uri);
}
string absolutePath = Uri.UnescapeDataString(targetUri.AbsolutePath);
string cleanPath = absolutePath.TrimStart('/');
int slashIndex = cleanPath.IndexOf('/');
if (slashIndex == -1)
{
return string.Empty;
}
string relativePath = cleanPath.Substring(slashIndex + 1);
return relativePath.Replace("/", "\\");
}
}
}

View File

@@ -3,14 +3,17 @@ using SMBLibrary.Client;
using System; using System;
using System.IO; using System.IO;
namespace BetterLyrics.WinUI3.Models.FileSystem namespace BetterLyrics.WinUI3.Services.FileSystemService.Providers
{ {
public partial class SMBReadOnlyStream : Stream public partial class SMBReadOnlyStream : Stream
{ {
private readonly ISMBFileStore _store; private readonly ISMBFileStore _store;
private readonly object _handle; private readonly object _handle;
private long _position; private long _position;
private long _length; // 新增:缓存文件长度 private long _length;
// SMB 协议建议的最大读取块大小 (64KB 是最安全的通用值)
private const int MaxReadChunkSize = 65536;
public SMBReadOnlyStream(ISMBFileStore store, object handle) public SMBReadOnlyStream(ISMBFileStore store, object handle)
{ {
@@ -25,18 +28,15 @@ namespace BetterLyrics.WinUI3.Models.FileSystem
} }
else else
{ {
// 如果获取失败,这是一个严重问题,意味着无法 Seek 到末尾 _length = 0; // 这是一个风险点,但为了不 crash 先设为 0
// 暂时设为 0但后续读取可能会出问题 System.Diagnostics.Debug.WriteLine($"SMB GetLength Error: {status}");
_length = 0;
} }
} }
public override bool CanRead => true; public override bool CanRead => true;
public override bool CanSeek => true; public override bool CanSeek => true;
public override bool CanWrite => false; public override bool CanWrite => false;
public override long Length => _length; public override long Length => _length;
public override long Position public override long Position
{ {
get => _position; get => _position;
@@ -45,30 +45,49 @@ namespace BetterLyrics.WinUI3.Models.FileSystem
public override int Read(byte[] buffer, int offset, int count) public override int Read(byte[] buffer, int offset, int count)
{ {
// 保护:如果位置已经超过文件末尾,直接返回 0 (EOF)
if (_position >= _length) return 0; if (_position >= _length) return 0;
// 保护:防止读取越界 (请求读取量不能超过剩余量) int totalBytesRead = 0;
long remaining = _length - _position; int remainingRequest = count;
int bytesToRequest = (int)Math.Min(count, remaining);
// 为了安全,保留对 remaining 的检查是必须的 // 循环读取,直到读完请求的数量,或者文件结束
if (bytesToRequest <= 0) return 0; while (remainingRequest > 0)
var status = _store.ReadFile(out byte[] data, _handle, _position, bytesToRequest);
if (status == NTStatus.STATUS_END_OF_FILE) return 0;
if (status != NTStatus.STATUS_SUCCESS)
{ {
throw new IOException($"SMB Read failed. Status: {status} (Pos: {_position}, Req: {bytesToRequest})"); // 计算剩余文件长度
long remainingFile = _length - _position;
if (remainingFile <= 0) break; // 已到末尾
// 计算本次 SMB 请求的大小 (取三者最小值请求剩余量、文件剩余量、SMB最大块限制)
int bytesToReadThisChunk = (int)Math.Min(Math.Min(remainingRequest, remainingFile), MaxReadChunkSize);
// 发送 SMB 请求
var status = _store.ReadFile(out byte[] data, _handle, _position, bytesToReadThisChunk);
// 处理结果
if (status == NTStatus.STATUS_END_OF_FILE) break;
if (status != NTStatus.STATUS_SUCCESS)
{
// 遇到错误抛出详细信息
throw new IOException($"SMB Read failed. Status: {status}, Position: {_position}, ChunkReq: {bytesToReadThisChunk}");
}
if (data == null || data.Length == 0) break;
// 复制数据到输出 buffer
Array.Copy(data, 0, buffer, offset + totalBytesRead, data.Length);
// 更新指针和计数器
_position += data.Length;
totalBytesRead += data.Length;
remainingRequest -= data.Length;
// 如果实际读到的比请求的少,通常意味着提前到了 EOF或者网络包较小
// 这里选择继续循环尝试,直到读不够或者明确 EOF
if (data.Length < bytesToReadThisChunk) break;
} }
if (data == null || data.Length == 0) return 0; return totalBytesRead;
Array.Copy(data, 0, buffer, offset, data.Length);
_position += data.Length;
return data.Length;
} }
public override long Seek(long offset, SeekOrigin origin) public override long Seek(long offset, SeekOrigin origin)
@@ -88,10 +107,9 @@ namespace BetterLyrics.WinUI3.Models.FileSystem
break; break;
} }
// 允许 Seek 超过 EOF (标准 Stream 行为),但在 Read 时会返回 0
if (newPos < 0) if (newPos < 0)
{ {
throw new IOException("An attempt was made to move the file pointer before the beginning of the file."); throw new IOException("Seek before beginning.");
} }
_position = newPos; _position = newPos;
@@ -111,4 +129,4 @@ namespace BetterLyrics.WinUI3.Models.FileSystem
} }
} }
} }
} }

View File

@@ -0,0 +1,129 @@
using BetterLyrics.WinUI3.Helper;
using BetterLyrics.WinUI3.Models;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Threading.Tasks;
using WebDav;
namespace BetterLyrics.WinUI3.Services.FileSystemService.Providers
{
public partial class WebDavFileSystem : IUnifiedFileSystem
{
private readonly WebDavClient _client;
private readonly MediaFolder _config;
private readonly Uri _baseAddress;
public WebDavFileSystem(MediaFolder config)
{
_config = config ?? throw new ArgumentNullException(nameof(config));
// 构建 BaseAddress (只包含 http://host:port/)
// MediaFolder.GetStandardUri() 返回的是带路径的完整 URI (http://host:port/path)
// 提取出根用于初始化 WebDavClient
var fullUri = _config.GetStandardUri();
// 提取 "http://host:port"
_baseAddress = new Uri($"{fullUri.Scheme}://{fullUri.Authority}");
_client = new WebDavClient(new WebDavClientParams
{
BaseAddress = _baseAddress,
Credentials = new System.Net.NetworkCredential(_config.UserName, _config.Password)
});
}
public async Task<bool> ConnectAsync()
{
var result = await _client.Propfind(_config.GetStandardUri().AbsoluteUri);
return result.IsSuccessful;
}
public async Task<List<FilesIndexItem>> GetFilesAsync(FilesIndexItem? parentFolder = null)
{
var list = new List<FilesIndexItem>();
Uri targetUri;
if (parentFolder == null)
{
targetUri = _config.GetStandardUri();
}
else
{
targetUri = new Uri(parentFolder.Uri);
}
var result = await _client.Propfind(targetUri.AbsoluteUri);
if (result.IsSuccessful)
{
string parentUriString = targetUri.AbsoluteUri;
if (!parentUriString.EndsWith("/")) parentUriString += "/";
string targetPathClean = targetUri.AbsolutePath.TrimEnd('/');
foreach (var res in result.Resources)
{
var itemUri = new Uri(_baseAddress, res.Uri);
// 过滤掉文件夹自身
if (itemUri.AbsolutePath.TrimEnd('/') == targetPathClean) continue;
string? name = res.DisplayName;
if (string.IsNullOrEmpty(name))
{
name = itemUri.AbsolutePath.TrimEnd('/').Split('/').Last();
name = System.Net.WebUtility.UrlDecode(name);
}
if (string.IsNullOrEmpty(name)) continue;
if (name.StartsWith(".")) continue;
bool isDir = res.IsCollection;
if (!isDir)
{
string extension = System.IO.Path.GetExtension(name);
// 如果后缀为空或不在白名单,跳过
if (string.IsNullOrEmpty(extension) || !FileHelper.AllSupportedExtensions.Contains(extension)) continue;
}
list.Add(new FilesIndexItem
{
MediaFolderId = _config.Id,
ParentUri = parentFolder?.Uri ?? _config.GetStandardUri().AbsoluteUri,
Uri = itemUri.AbsoluteUri,
FileName = name,
IsDirectory = res.IsCollection,
FileSize = res.ContentLength ?? 0,
LastModified = res.LastModifiedDate ?? DateTime.MinValue,
});
}
}
return list;
}
public async Task<Stream?> OpenReadAsync(FilesIndexItem entity)
{
if (entity == null) return null;
// WebDAV 获取流,直接使用完整 URI
var res = await _client.GetRawFile(entity.Uri);
if (!res.IsSuccessful)
throw new IOException($"WebDAV Error {res.StatusCode}: {res.Description}");
return res.Stream;
}
public async Task DisconnectAsync() => await Task.CompletedTask;
public void Dispose() => _client?.Dispose();
}
}

View File

@@ -1,12 +0,0 @@
// 2025/6/23 by Zhe Fang
using BetterLyrics.WinUI3.Events;
using System;
namespace BetterLyrics.WinUI3.Services.LibWatcherService
{
public interface ILibWatcherService
{
event EventHandler<LibChangedEventArgs>? MusicLibraryFilesChanged;
}
}

View File

@@ -1,91 +0,0 @@
// 2025/6/23 by Zhe Fang
using BetterLyrics.WinUI3.Events;
using BetterLyrics.WinUI3.Services.SettingsService;
using BetterLyrics.WinUI3.ViewModels;
using Microsoft.UI.Dispatching;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
namespace BetterLyrics.WinUI3.Services.LibWatcherService
{
public class LibWatcherService : BaseViewModel, IDisposable, ILibWatcherService
{
private readonly ISettingsService _settingsService;
private readonly Dictionary<string, FileSystemWatcher> _watchers = [];
public LibWatcherService(ISettingsService settingsService)
{
_settingsService = settingsService;
_settingsService.AppSettings.LocalMediaFolders.CollectionChanged += LocalMediaFolders_CollectionChanged;
_settingsService.AppSettings.LocalMediaFolders.ItemPropertyChanged += LocalMediaFolders_ItemPropertyChanged;
UpdateWatchers();
}
private void LocalMediaFolders_ItemPropertyChanged(object? sender, Collections.ItemPropertyChangedEventArgs e)
{
UpdateWatchers();
}
private void LocalMediaFolders_CollectionChanged(object? sender, System.Collections.Specialized.NotifyCollectionChangedEventArgs e)
{
UpdateWatchers();
}
public event EventHandler<LibChangedEventArgs>? MusicLibraryFilesChanged;
public void Dispose()
{
foreach (var watcher in _watchers.Values)
{
watcher.Dispose();
}
_watchers.Clear();
}
private void UpdateWatchers()
{
var folders = _settingsService.AppSettings.LocalMediaFolders;
// 移除不再监听的
foreach (var key in _watchers.Keys.ToList())
{
if (!folders.Any(x => x.Path == key && x.IsEnabled && x.IsRealTimeWatchEnabled))
{
_watchers[key].Dispose();
_watchers.Remove(key);
}
}
// 添加新的监听
foreach (var folder in folders)
{
if (!_watchers.ContainsKey(folder.Path) && Directory.Exists(folder.Path) && folder.IsEnabled && folder.IsRealTimeWatchEnabled)
{
var watcher = new FileSystemWatcher(folder.Path)
{
IncludeSubdirectories = true,
EnableRaisingEvents = true,
};
watcher.Created += (s, e) => OnChanged(folder.Path, e);
watcher.Changed += (s, e) => OnChanged(folder.Path, e);
watcher.Deleted += (s, e) => OnChanged(folder.Path, e);
watcher.Renamed += (s, e) => OnChanged(folder.Path, e);
_watchers[folder.Path] = watcher;
}
}
}
private void OnChanged(string folder, FileSystemEventArgs e)
{
_dispatcherQueue.TryEnqueue(DispatcherQueuePriority.Low, () =>
{
MusicLibraryFilesChanged?.Invoke(
this,
new LibChangedEventArgs(folder, e.FullPath, e.ChangeType)
);
});
}
}
}

View File

@@ -5,6 +5,7 @@ using BetterLyrics.WinUI3.Extensions;
using BetterLyrics.WinUI3.Helper; using BetterLyrics.WinUI3.Helper;
using BetterLyrics.WinUI3.Models; using BetterLyrics.WinUI3.Models;
using BetterLyrics.WinUI3.Providers; using BetterLyrics.WinUI3.Providers;
using BetterLyrics.WinUI3.Services.FileSystemService;
using BetterLyrics.WinUI3.Services.SettingsService; using BetterLyrics.WinUI3.Services.SettingsService;
using Lyricify.Lyrics.Helpers; using Lyricify.Lyrics.Helpers;
using Lyricify.Lyrics.Searchers; using Lyricify.Lyrics.Searchers;
@@ -28,11 +29,13 @@ namespace BetterLyrics.WinUI3.Services.LyricsSearchService
private readonly AppleMusic _appleMusic; private readonly AppleMusic _appleMusic;
private readonly ISettingsService _settingsService; private readonly ISettingsService _settingsService;
private readonly IFileSystemService _fileSystemService;
private readonly ILogger _logger; private readonly ILogger _logger;
public LyricsSearchService(ISettingsService settingsService, ILogger<LyricsSearchService> logger) public LyricsSearchService(ISettingsService settingsService, IFileSystemService fileSystemService, ILogger<LyricsSearchService> logger)
{ {
_settingsService = settingsService; _settingsService = settingsService;
_fileSystemService = fileSystemService;
_logger = logger; _logger = logger;
_lrcLibHttpClient = new(); _lrcLibHttpClient = new();
@@ -276,92 +279,50 @@ namespace BetterLyrics.WinUI3.Services.LyricsSearchService
{ {
int maxScore = 0; int maxScore = 0;
MediaFolder? bestFolder = null; FilesIndexItem? bestFileEntity = null;
string? bestFilePath = null; MediaFolder? bestFolderConfig = null;
var lyricsSearchResult = new LyricsSearchResult(); var lyricsSearchResult = new LyricsSearchResult();
if (format.ToLyricsSearchProvider() is LyricsSearchProvider lyricsSearchProvider) if (format.ToLyricsSearchProvider() is LyricsSearchProvider lyricsSearchProvider)
{ {
lyricsSearchResult.Provider = lyricsSearchProvider; lyricsSearchResult.Provider = lyricsSearchProvider;
} }
foreach (var folder in _settingsService.AppSettings.LocalMediaFolders) string targetExt = format.ToFileExtension();
var enabledFolders = _settingsService.AppSettings.LocalMediaFolders
.Where(f => f.IsEnabled)
.ToList();
var enabledIds = enabledFolders.Select(f => f.Id).ToList();
if (enabledIds.Count == 0) return lyricsSearchResult;
var allFiles = await _fileSystemService.GetParsedFilesAsync(enabledIds);
allFiles = allFiles.Where(x => FileHelper.LyricExtensions.Contains(Path.GetExtension(x.FileName))).ToList();
foreach (var item in allFiles)
{ {
if (!folder.IsEnabled) continue; if (item.FileName.EndsWith(targetExt, StringComparison.OrdinalIgnoreCase))
try
{ {
using var fs = folder.CreateFileSystem(); int score = MetadataComparer.CalculateScore(songInfo, new LyricsSearchResult { Reference = item.FileName });
if (fs == null) continue;
if (!await fs.ConnectAsync()) continue;
// 递归扫描 if (score > maxScore)
var foldersToScan = new Queue<string>();
foldersToScan.Enqueue(""); // 从根目录开始
string targetExt = format.ToFileExtension();
while (foldersToScan.Count > 0)
{ {
var currentPath = foldersToScan.Dequeue(); maxScore = score;
var items = await fs.GetFilesAsync(currentPath); bestFileEntity = item;
foreach (var item in items) bestFolderConfig = enabledFolders.FirstOrDefault(f => f.Id == item.MediaFolderId);
{
if (item.IsFolder)
{
foldersToScan.Enqueue(Path.Combine(currentPath, item.Name));
continue;
}
if (item.Name.EndsWith(targetExt, StringComparison.OrdinalIgnoreCase))
{
int score = MetadataComparer.CalculateScore(songInfo, new LyricsSearchResult { Reference = item.FullPath });
if (score > maxScore)
{
maxScore = score;
bestFilePath = item.FullPath;
bestFolder = folder;
}
}
}
} }
} }
catch (Exception ex)
{
// 日志记录...
}
} }
// 4. 如果找到了最佳匹配,读取内容 if (bestFileEntity != null)
if (bestFolder != null && bestFilePath != null)
{ {
try lyricsSearchResult.Raw = bestFileEntity.EmbeddedLyrics;
{
// 重新连接以读取文件 (因为之前的 fs 已经在 using 结束时释放)
using var fs = bestFolder.CreateFileSystem();
if (fs != null && await fs.ConnectAsync())
{
using var stream = await fs.OpenReadAsync(bestFilePath);
// 使用 StreamReader 读取文本 lyricsSearchResult.Reference = bestFileEntity.Uri;
// 注意:这里简单使用 Default 编码,如果需要探测编码(FileHelper.GetEncoding) lyricsSearchResult.MatchPercentage = maxScore;
// 可能需要先读一部分字节来判断,或者使用带编码探测的库。
using var reader = new StreamReader(stream);
string raw = await reader.ReadToEndAsync();
lyricsSearchResult.Reference = bestFilePath;
lyricsSearchResult.MatchPercentage = maxScore;
lyricsSearchResult.Raw = raw;
}
}
catch (Exception)
{
// 读取失败处理
}
} }
return lyricsSearchResult; return lyricsSearchResult;
@@ -369,107 +330,53 @@ namespace BetterLyrics.WinUI3.Services.LyricsSearchService
private async Task<LyricsSearchResult> SearchEmbedded(SongInfo songInfo) private async Task<LyricsSearchResult> SearchEmbedded(SongInfo songInfo)
{ {
int bestScore = 0;
string? bestFilePath = null;
string? bestRaw = null;
// 用于最后回填 Metadata
string? bestTitle = null;
string[]? bestArtists = null;
string? bestAlbum = null;
double bestDuration = 0;
var lyricsSearchResult = new LyricsSearchResult var lyricsSearchResult = new LyricsSearchResult
{ {
Provider = LyricsSearchProvider.LocalMusicFile, Provider = LyricsSearchProvider.LocalMusicFile,
}; };
foreach (var folder in _settingsService.AppSettings.LocalMediaFolders) var enabledIds = _settingsService.AppSettings.LocalMediaFolders
.Where(f => f.IsEnabled)
.Select(f => f.Id)
.ToList();
if (enabledIds.Count == 0) return lyricsSearchResult;
var allFiles = await _fileSystemService.GetParsedFilesAsync(enabledIds);
allFiles = allFiles.Where(x => FileHelper.MusicExtensions.Contains(Path.GetExtension(x.FileName))).ToList();
FilesIndexItem? bestFile = null;
int maxScore = 0;
foreach (var item in allFiles)
{ {
if (!folder.IsEnabled) continue; if (string.IsNullOrEmpty(item.EmbeddedLyrics)) continue;
try int score = MetadataComparer.CalculateScore(songInfo, new LyricsSearchResult
{ {
using var fs = folder.CreateFileSystem(); Title = item.Title,
if (fs == null) continue; Artists = item.Artists?.Split(ATL.Settings.DisplayValueSeparator),
if (!await fs.ConnectAsync()) continue; Album = item.Album,
Duration = item.Duration
});
var foldersToScan = new Queue<string>(); if (score > maxScore)
foldersToScan.Enqueue("");
while (foldersToScan.Count > 0)
{
var currentPath = foldersToScan.Dequeue();
var items = await fs.GetFilesAsync(currentPath);
foreach (var item in items)
{
if (item.IsFolder)
{
foldersToScan.Enqueue(Path.Combine(currentPath, item.Name));
continue;
}
var ext = Path.GetExtension(item.Name).ToLower();
if (FileHelper.MusicExtensions.Contains(ext))
{
try
{
using var stream = await fs.OpenReadAsync(item.FullPath);
var track = new ExtendedTrack(item.FullPath, stream);
var raw = track.RawLyrics;
if (!string.IsNullOrEmpty(raw))
{
int score = MetadataComparer.CalculateScore(songInfo, new LyricsSearchResult
{
Title = track.Title,
Artists = track.Artist?.Split(ATL.Settings.DisplayValueSeparator),
Album = track.Album,
Duration = track.Duration,
Reference = item.FullPath,
});
if (score > bestScore)
{
bestScore = score;
bestFilePath = item.FullPath;
bestRaw = raw;
// 缓存当前最佳的元数据,避免最后还需要重新打开文件读一次
bestTitle = track.Title;
bestArtists = track.Artist?.Split(ATL.Settings.DisplayValueSeparator);
bestAlbum = track.Album;
bestDuration = track.Duration;
}
}
}
catch
{
// 单个文件解析失败忽略
}
}
}
}
}
catch
{ {
// 文件夹扫描失败忽略 maxScore = score;
bestFile = item;
} }
} }
if (bestFilePath != null) if (bestFile != null && maxScore > 0)
{ {
// 直接使用缓存的数据,不需要 new Track(bestFile) 了 lyricsSearchResult.Title = bestFile.Title;
lyricsSearchResult.Title = bestTitle; lyricsSearchResult.Artists = bestFile.Artists?.Split(ATL.Settings.DisplayValueSeparator);
lyricsSearchResult.Artists = bestArtists; lyricsSearchResult.Album = bestFile.Album;
lyricsSearchResult.Album = bestAlbum; lyricsSearchResult.Duration = bestFile.Duration;
lyricsSearchResult.Duration = bestDuration;
lyricsSearchResult.Raw = bestRaw; lyricsSearchResult.Raw = bestFile.EmbeddedLyrics;
lyricsSearchResult.Reference = bestFilePath; lyricsSearchResult.Reference = bestFile.Uri;
lyricsSearchResult.MatchPercentage = bestScore; lyricsSearchResult.MatchPercentage = maxScore;
} }
return lyricsSearchResult; return lyricsSearchResult;
@@ -651,11 +558,11 @@ namespace BetterLyrics.WinUI3.Services.LyricsSearchService
ISearchResult? result; ISearchResult? result;
if (songInfo.SongId != null && searcher == Searchers.Netease && PlayerIDHelper.IsNeteaseFamily(songInfo.PlayerId)) if (songInfo.SongId != null && searcher == Searchers.Netease && PlayerIdHelper.IsNeteaseFamily(songInfo.PlayerId))
{ {
result = new NeteaseSearchResult(songInfo.Title, songInfo.Artists, songInfo.Album, [], (int)songInfo.DurationMs, songInfo.SongId); result = new NeteaseSearchResult(songInfo.Title, songInfo.Artists, songInfo.Album, [], (int)songInfo.DurationMs, songInfo.SongId);
} }
else if (songInfo.SongId != null && searcher == Searchers.QQMusic && songInfo.PlayerId == Constants.PlayerID.QQMusic) else if (songInfo.SongId != null && searcher == Searchers.QQMusic && songInfo.PlayerId == Constants.PlayerId.QQMusic)
{ {
result = new QQMusicSearchResult(songInfo.Title, songInfo.Artists, songInfo.Album, [], (int)songInfo.DurationMs, songInfo.SongId, ""); result = new QQMusicSearchResult(songInfo.Title, songInfo.Artists, songInfo.Album, [], (int)songInfo.DurationMs, songInfo.SongId, "");
} }

View File

@@ -9,6 +9,7 @@ using Microsoft.UI.Xaml;
using Microsoft.UI.Xaml.Media.Imaging; using Microsoft.UI.Xaml.Media.Imaging;
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Diagnostics;
using System.Linq; using System.Linq;
using System.Threading; using System.Threading;
using System.Threading.Tasks; using System.Threading.Tasks;

View File

@@ -11,8 +11,9 @@ using BetterLyrics.WinUI3.Models;
using BetterLyrics.WinUI3.Models.Settings; using BetterLyrics.WinUI3.Models.Settings;
using BetterLyrics.WinUI3.Services.AlbumArtSearchService; using BetterLyrics.WinUI3.Services.AlbumArtSearchService;
using BetterLyrics.WinUI3.Services.DiscordService; using BetterLyrics.WinUI3.Services.DiscordService;
using BetterLyrics.WinUI3.Services.LibWatcherService; using BetterLyrics.WinUI3.Services.LastFMService;
using BetterLyrics.WinUI3.Services.LyricsSearchService; using BetterLyrics.WinUI3.Services.LyricsSearchService;
using BetterLyrics.WinUI3.Services.PlayHistoryService;
using BetterLyrics.WinUI3.Services.SettingsService; using BetterLyrics.WinUI3.Services.SettingsService;
using BetterLyrics.WinUI3.Services.TranslationService; using BetterLyrics.WinUI3.Services.TranslationService;
using BetterLyrics.WinUI3.Services.TransliterationService; using BetterLyrics.WinUI3.Services.TransliterationService;
@@ -27,6 +28,7 @@ using Microsoft.Extensions.Logging;
using Microsoft.UI.Dispatching; using Microsoft.UI.Dispatching;
using Microsoft.UI.Xaml.Controls; using Microsoft.UI.Xaml.Controls;
using System; using System;
using System.Diagnostics;
using System.Linq; using System.Linq;
using System.Runtime.InteropServices.WindowsRuntime; using System.Runtime.InteropServices.WindowsRuntime;
using System.Text.Json; using System.Text.Json;
@@ -41,7 +43,8 @@ namespace BetterLyrics.WinUI3.Services.MediaSessionsService
public partial class MediaSessionsService : BaseViewModel, IMediaSessionsService, public partial class MediaSessionsService : BaseViewModel, IMediaSessionsService,
IRecipient<PropertyChangedMessage<bool>>, IRecipient<PropertyChangedMessage<bool>>,
IRecipient<PropertyChangedMessage<string>>, IRecipient<PropertyChangedMessage<string>>,
IRecipient<PropertyChangedMessage<ChineseRomanization>> IRecipient<PropertyChangedMessage<ChineseRomanization>>,
IRecipient<PropertyChangedMessage<DateTime?>>
{ {
private EventSourceReader? _sse = null; private EventSourceReader? _sse = null;
private readonly MediaManager _mediaManager = new(); private readonly MediaManager _mediaManager = new();
@@ -52,8 +55,9 @@ namespace BetterLyrics.WinUI3.Services.MediaSessionsService
private readonly ITranslationService _translationService; private readonly ITranslationService _translationService;
private readonly ITransliterationService _transliterationService; private readonly ITransliterationService _transliterationService;
private readonly ISettingsService _settingsService; private readonly ISettingsService _settingsService;
private readonly ILibWatcherService _libWatcherService;
private readonly IDiscordService _discordService; private readonly IDiscordService _discordService;
private readonly IPlayHistoryService _playHistoryService;
private readonly ILastFMService _lastFMService;
private readonly ILogger<MediaSessionsService> _logger; private readonly ILogger<MediaSessionsService> _logger;
private double _lxMusicPositionSeconds = 0; private double _lxMusicPositionSeconds = 0;
@@ -61,6 +65,8 @@ namespace BetterLyrics.WinUI3.Services.MediaSessionsService
private readonly DispatcherQueueTimer? _onMediaPropsChangedTimer; private readonly DispatcherQueueTimer? _onMediaPropsChangedTimer;
private readonly Stopwatch _scrobbleStopwatch = new();
[ObservableProperty][NotifyPropertyChangedRecipients] public partial bool CurrentIsPlaying { get; private set; } = false; [ObservableProperty][NotifyPropertyChangedRecipients] public partial bool CurrentIsPlaying { get; private set; } = false;
[ObservableProperty][NotifyPropertyChangedRecipients] public partial TimeSpan CurrentPosition { get; private set; } = TimeSpan.Zero; [ObservableProperty][NotifyPropertyChangedRecipients] public partial TimeSpan CurrentPosition { get; private set; } = TimeSpan.Zero;
[ObservableProperty][NotifyPropertyChangedRecipients] public partial SongInfo? CurrentSongInfo { get; private set; } = SongInfoExtensions.Placeholder; [ObservableProperty][NotifyPropertyChangedRecipients] public partial SongInfo? CurrentSongInfo { get; private set; } = SongInfoExtensions.Placeholder;
@@ -71,19 +77,21 @@ namespace BetterLyrics.WinUI3.Services.MediaSessionsService
ISettingsService settingsService, ISettingsService settingsService,
IAlbumArtSearchService albumArtSearchService, IAlbumArtSearchService albumArtSearchService,
ILyricsSearchService lyricsSearchService, ILyricsSearchService lyricsSearchService,
ILibWatcherService libWatcherService,
IDiscordService discordService, IDiscordService discordService,
ITranslationService libreTranslateService, ITranslationService libreTranslateService,
ITransliterationService transliterationService, ITransliterationService transliterationService,
IPlayHistoryService playHistoryService,
ILastFMService lastFMService,
ILogger<MediaSessionsService> logger) ILogger<MediaSessionsService> logger)
{ {
_settingsService = settingsService; _settingsService = settingsService;
_albumArtSearchService = albumArtSearchService; _albumArtSearchService = albumArtSearchService;
_lyrcsSearchService = lyricsSearchService; _lyrcsSearchService = lyricsSearchService;
_libWatcherService = libWatcherService;
_translationService = libreTranslateService; _translationService = libreTranslateService;
_transliterationService = transliterationService; _transliterationService = transliterationService;
_discordService = discordService; _discordService = discordService;
_playHistoryService = playHistoryService;
_lastFMService = lastFMService;
_logger = logger; _logger = logger;
_onMediaPropsChangedTimer = _dispatcherQueue.CreateTimer(); _onMediaPropsChangedTimer = _dispatcherQueue.CreateTimer();
@@ -91,13 +99,10 @@ namespace BetterLyrics.WinUI3.Services.MediaSessionsService
_settingsService.AppSettings.MediaSourceProvidersInfo.ItemPropertyChanged += MediaSourceProvidersInfo_ItemPropertyChanged; _settingsService.AppSettings.MediaSourceProvidersInfo.ItemPropertyChanged += MediaSourceProvidersInfo_ItemPropertyChanged;
_settingsService.AppSettings.LocalMediaFolders.CollectionChanged += LocalMediaFolders_CollectionChanged; _settingsService.AppSettings.LocalMediaFolders.CollectionChanged += LocalMediaFolders_CollectionChanged;
_settingsService.AppSettings.LocalMediaFolders.ItemPropertyChanged += LocalMediaFolders_ItemPropertyChanged;
_settingsService.AppSettings.MappedSongSearchQueries.CollectionChanged += MappedSongSearchQueries_CollectionChanged; _settingsService.AppSettings.MappedSongSearchQueries.CollectionChanged += MappedSongSearchQueries_CollectionChanged;
_settingsService.AppSettings.MappedSongSearchQueries.ItemPropertyChanged += MappedSongSearchQueries_ItemPropertyChanged; _settingsService.AppSettings.MappedSongSearchQueries.ItemPropertyChanged += MappedSongSearchQueries_ItemPropertyChanged;
_libWatcherService.MusicLibraryFilesChanged += LibWatcherService_MusicLibraryFilesChanged;
InitMediaManager(); InitMediaManager();
} }
@@ -111,12 +116,6 @@ namespace BetterLyrics.WinUI3.Services.MediaSessionsService
UpdateLyrics(); UpdateLyrics();
} }
private void LocalMediaFolders_ItemPropertyChanged(object? sender, ItemPropertyChangedEventArgs e)
{
UpdateAlbumArt();
UpdateLyrics();
}
private void LocalMediaFolders_CollectionChanged(object? sender, System.Collections.Specialized.NotifyCollectionChangedEventArgs e) private void LocalMediaFolders_CollectionChanged(object? sender, System.Collections.Specialized.NotifyCollectionChangedEventArgs e)
{ {
UpdateAlbumArt(); UpdateAlbumArt();
@@ -144,12 +143,6 @@ namespace BetterLyrics.WinUI3.Services.MediaSessionsService
} }
} }
private void LibWatcherService_MusicLibraryFilesChanged(object? sender, LibChangedEventArgs e)
{
UpdateAlbumArt();
UpdateLyrics();
}
private MediaSourceProviderInfo? GetCurrentMediaSourceProviderInfo() private MediaSourceProviderInfo? GetCurrentMediaSourceProviderInfo()
{ {
var desiredSession = GetCurrentSession(); var desiredSession = GetCurrentSession();
@@ -161,7 +154,7 @@ namespace BetterLyrics.WinUI3.Services.MediaSessionsService
var found = _settingsService.AppSettings.MediaSourceProvidersInfo.FirstOrDefault(s => s.Provider == id); var found = _settingsService.AppSettings.MediaSourceProvidersInfo.FirstOrDefault(s => s.Provider == id);
if (_settingsService.AppSettings.MusicGallerySettings.LyricsWindowStatus.IsOpened) if (_settingsService.AppSettings.MusicGallerySettings.LyricsWindowStatus.IsOpened)
{ {
if (PlayerIDHelper.IsBetterLyrics(found?.Provider)) if (PlayerIdHelper.IsBetterLyrics(found?.Provider))
{ {
return found?.IsEnabled ?? true; return found?.IsEnabled ?? true;
} }
@@ -286,7 +279,7 @@ namespace BetterLyrics.WinUI3.Services.MediaSessionsService
{ {
CurrentSongInfo = SongInfoExtensions.Placeholder; CurrentSongInfo = SongInfoExtensions.Placeholder;
if (PlayerIDHelper.IsLXMusic(sessionId)) if (PlayerIdHelper.IsLXMusic(sessionId))
{ {
StopSSE(); StopSSE();
} }
@@ -305,20 +298,20 @@ namespace BetterLyrics.WinUI3.Services.MediaSessionsService
string? fixedAlbum = mediaProperties?.AlbumTitle; string? fixedAlbum = mediaProperties?.AlbumTitle;
string? songId = null; string? songId = null;
if (PlayerIDHelper.IsAppleMusic(sessionId)) if (PlayerIdHelper.IsAppleMusic(sessionId))
{ {
fixedArtist = mediaProperties?.Artist.Split(" — ").FirstOrDefault(); fixedArtist = mediaProperties?.Artist.Split(" — ").FirstOrDefault();
fixedAlbum = mediaProperties?.Artist.Split(" — ").LastOrDefault(); fixedAlbum = mediaProperties?.Artist.Split(" — ").LastOrDefault();
fixedAlbum = fixedAlbum?.Replace(" - Single", ""); fixedAlbum = fixedAlbum?.Replace(" - Single", "");
fixedAlbum = fixedAlbum?.Replace(" - EP", ""); fixedAlbum = fixedAlbum?.Replace(" - EP", "");
} }
else if (PlayerIDHelper.IsNeteaseFamily(sessionId)) else if (PlayerIdHelper.IsNeteaseFamily(sessionId))
{ {
songId = mediaProperties?.Genres songId = mediaProperties?.Genres
.FirstOrDefault(x => x.StartsWith(ExtendedGenreFiled.NetEaseCloudMusicTrackID))? .FirstOrDefault(x => x.StartsWith(ExtendedGenreFiled.NetEaseCloudMusicTrackID))?
.Replace(ExtendedGenreFiled.NetEaseCloudMusicTrackID, ""); .Replace(ExtendedGenreFiled.NetEaseCloudMusicTrackID, "");
} }
else if (sessionId == PlayerID.QQMusic) else if (sessionId == PlayerId.QQMusic)
{ {
songId = mediaProperties?.Genres songId = mediaProperties?.Genres
.FirstOrDefault(x => x.StartsWith(ExtendedGenreFiled.QQMusicTrackID))? .FirstOrDefault(x => x.StartsWith(ExtendedGenreFiled.QQMusicTrackID))?
@@ -329,6 +322,35 @@ namespace BetterLyrics.WinUI3.Services.MediaSessionsService
.FirstOrDefault(x => x.StartsWith(ExtendedGenreFiled.FileName))? .FirstOrDefault(x => x.StartsWith(ExtendedGenreFiled.FileName))?
.Replace(ExtendedGenreFiled.FileName, ""); .Replace(ExtendedGenreFiled.FileName, "");
// 写入播放记录
if (CurrentSongInfo != null && CurrentSongInfo.Title != "N/A")
{
// 必须捕获一个副本给异步任务,因为 CurrentSongInfo 马上就要变了
var lastSong = CurrentSongInfo;
// 当前秒表时间 >= 上一首总时长 / 2
if (lastSong.DurationMs > 0 &&
_scrobbleStopwatch.Elapsed.TotalMilliseconds >= (lastSong.DurationMs / 2))
{
// 写入本地播放记录
var playHistoryItem = lastSong.ToPlayHistoryItem(_scrobbleStopwatch.Elapsed.TotalMilliseconds);
if (playHistoryItem != null)
{
// 后台
_ = Task.Run(() => _playHistoryService.AddLogAsync(playHistoryItem));
_logger.LogInformation($"[Scrobble] 结算成功: {lastSong.Title}");
}
// 写入 Last.fm 播放记录
var isLastFMEnabled = CurrentMediaSourceProviderInfo?.IsLastFMTrackEnabled ?? false;
if (isLastFMEnabled)
{
// 后台
_ = Task.Run(() => _lastFMService.TrackAsync(lastSong));
}
}
}
_scrobbleStopwatch.Restart();
CurrentSongInfo = new SongInfo CurrentSongInfo = new SongInfo
{ {
Title = mediaProperties?.Title ?? "N/A", Title = mediaProperties?.Title ?? "N/A",
@@ -340,7 +362,7 @@ namespace BetterLyrics.WinUI3.Services.MediaSessionsService
LinkedFileName = linkedFileName LinkedFileName = linkedFileName
}; };
if (PlayerIDHelper.IsLXMusic(sessionId)) if (PlayerIdHelper.IsLXMusic(sessionId))
{ {
StartSSE(); StartSSE();
} }
@@ -349,7 +371,7 @@ namespace BetterLyrics.WinUI3.Services.MediaSessionsService
StopSSE(); StopSSE();
} }
if (PlayerIDHelper.IsLXMusic(sessionId) && _lxMusicAlbumArtBytes != null) if (PlayerIdHelper.IsLXMusic(sessionId) && _lxMusicAlbumArtBytes != null)
{ {
_SMTCAlbumArtBuffer = _lxMusicAlbumArtBytes.AsBuffer(); _SMTCAlbumArtBuffer = _lxMusicAlbumArtBytes.AsBuffer();
} }
@@ -540,7 +562,7 @@ namespace BetterLyrics.WinUI3.Services.MediaSessionsService
{ {
_dispatcherQueue.TryEnqueue(DispatcherQueuePriority.Low, async () => _dispatcherQueue.TryEnqueue(DispatcherQueuePriority.Low, async () =>
{ {
if (PlayerIDHelper.IsLXMusic(CurrentSongInfo?.PlayerId)) if (PlayerIdHelper.IsLXMusic(CurrentSongInfo?.PlayerId))
{ {
var data = JsonSerializer.Deserialize(e.Message, Serialization.SourceGenerationContext.Default.JsonElement); var data = JsonSerializer.Deserialize(e.Message, Serialization.SourceGenerationContext.Default.JsonElement);
if (data.ValueKind == JsonValueKind.Number) if (data.ValueKind == JsonValueKind.Number)
@@ -693,6 +715,14 @@ namespace BetterLyrics.WinUI3.Services.MediaSessionsService
MediaManager_OnFocusedSessionChanged(null); MediaManager_OnFocusedSessionChanged(null);
} }
} }
else if (message.Sender is MediaFolder)
{
if (message.PropertyName == nameof(MediaFolder.IsEnabled))
{
UpdateAlbumArt();
UpdateLyrics();
}
}
} }
public void Receive(PropertyChangedMessage<string> message) public void Receive(PropertyChangedMessage<string> message)
@@ -726,5 +756,16 @@ namespace BetterLyrics.WinUI3.Services.MediaSessionsService
} }
} }
public void Receive(PropertyChangedMessage<DateTime?> message)
{
if (message.Sender is MediaFolder)
{
if (message.PropertyName == nameof(MediaFolder.LastSyncTime))
{
UpdateAlbumArt();
UpdateLyrics();
}
}
}
} }
} }

View File

@@ -0,0 +1,25 @@
using BetterLyrics.WinUI3.Models;
using BetterLyrics.WinUI3.Models.Stats;
using System;
using System.Collections.Generic;
using System.Text;
using System.Threading.Tasks;
namespace BetterLyrics.WinUI3.Services.PlayHistoryService
{
public interface IPlayHistoryService
{
Task AddLogAsync(PlayHistoryItem item);
Task<List<PlayHistoryItem>> GetRecentLogsAsync(int limit = 50);
Task<List<PlayHistoryItem>> GetLogsByDateRangeAsync(DateTime start, DateTime end);
Task<List<SongPlayCount>> GetTopSongsAsync(DateTime start, DateTime end, int limit = 10);
Task<List<ArtistPlayCount>> GetTopArtistsAsync(DateTime start, DateTime end, int limit = 10);
Task<TimeSpan> GetTotalListeningDurationAsync(DateTime start, DateTime end);
Task<List<PlayerStats>> GetPlayerDistributionAsync(DateTime start, DateTime end);
Task DeleteLogAsync(int id);
Task ClearHistoryAsync();
Task GenerateTestDataAsync(int count = 100);
}
}

View File

@@ -0,0 +1,258 @@
using BetterLyrics.WinUI3.Models;
using BetterLyrics.WinUI3.Models.Db;
using BetterLyrics.WinUI3.Models.Stats;
using Microsoft.EntityFrameworkCore;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
namespace BetterLyrics.WinUI3.Services.PlayHistoryService
{
public class PlayHistoryService : IPlayHistoryService
{
private readonly IDbContextFactory<PlayHistoryDbContext> _contextFactory;
public PlayHistoryService(IDbContextFactory<PlayHistoryDbContext> contextFactory)
{
_contextFactory = contextFactory;
}
public async Task AddLogAsync(PlayHistoryItem item)
{
using var context = await _contextFactory.CreateDbContextAsync();
// 确保 UTC
if (item.StartedAt.Kind != DateTimeKind.Utc)
{
item.StartedAt = item.StartedAt.ToUniversalTime();
}
context.PlayHistory.Add(item);
await context.SaveChangesAsync();
}
public async Task<List<PlayHistoryItem>> GetRecentLogsAsync(int limit = 50)
{
using var context = await _contextFactory.CreateDbContextAsync();
return await context.PlayHistory
.AsNoTracking() // 读操作,不需要追踪状态,提升性能
.OrderByDescending(x => x.StartedAt)
.Take(limit)
.ToListAsync();
}
public async Task<List<PlayHistoryItem>> GetLogsByDateRangeAsync(DateTime start, DateTime end)
{
using var context = await _contextFactory.CreateDbContextAsync();
return await context.PlayHistory
.AsNoTracking()
.Where(x => x.StartedAt >= start && x.StartedAt <= end)
.ToListAsync();
}
public async Task<List<SongPlayCount>> GetTopSongsAsync(DateTime start, DateTime end, int limit = 10)
{
using var context = await _contextFactory.CreateDbContextAsync();
// EF Core 会自动将这个 LINQ 翻译成高效的 GROUP BY SQL
return await context.PlayHistory
.AsNoTracking()
.Where(x => x.StartedAt >= start && x.StartedAt <= end)
.GroupBy(x => new { x.Title, x.Artist }) // 组合分组
.Select(g => new SongPlayCount
{
Title = g.Key.Title,
Artist = g.Key.Artist,
PlayCount = g.Count()
})
.OrderByDescending(x => x.PlayCount)
.Take(limit)
.ToListAsync();
}
public async Task<List<ArtistPlayCount>> GetTopArtistsAsync(DateTime start, DateTime end, int limit = 10)
{
using var context = await _contextFactory.CreateDbContextAsync();
return await context.PlayHistory
.AsNoTracking()
.Where(x => x.StartedAt >= start && x.StartedAt <= end)
.GroupBy(x => x.Artist)
.Select(g => new ArtistPlayCount
{
Artist = g.Key,
PlayCount = g.Count(),
// 注意SQLite 存储 double 精度,这里求和后转秒
TotalDurationSeconds = g.Sum(x => x.DurationPlayedMs) / 1000.0
})
.OrderByDescending(x => x.PlayCount)
.Take(limit)
.ToListAsync();
}
public async Task<TimeSpan> GetTotalListeningDurationAsync(DateTime start, DateTime end)
{
using var context = await _contextFactory.CreateDbContextAsync();
var totalMs = await context.PlayHistory
.Where(x => x.StartedAt >= start && x.StartedAt <= end)
.SumAsync(x => x.DurationPlayedMs); // 直接在数据库层面求和
return TimeSpan.FromMilliseconds(totalMs);
}
public async Task<List<PlayerStats>> GetPlayerDistributionAsync(DateTime start, DateTime end)
{
using var context = await _contextFactory.CreateDbContextAsync();
return await context.PlayHistory
.AsNoTracking()
.Where(x => x.StartedAt >= start && x.StartedAt <= end)
.GroupBy(x => x.PlayerId)
.Select(g => new PlayerStats
{
PlayerId = g.Key,
Count = g.Count()
})
.OrderByDescending(x => x.Count)
.ToListAsync();
}
public async Task DeleteLogAsync(int id)
{
using var context = await _contextFactory.CreateDbContextAsync();
// EF Core 删除需要先查询,或者使用 ExecuteDeleteAsync (EF Core 7+)
// 写法 1 (传统):
// var item = await context.PlayHistory.FindAsync(id);
// if (item != null) { context.PlayHistory.Remove(item); await context.SaveChangesAsync(); }
// 写法 2 (EF Core 7.0+ 高效写法,直接生成 DELETE SQL):
await context.PlayHistory
.Where(x => x.Id == id)
.ExecuteDeleteAsync();
}
public async Task ClearHistoryAsync()
{
using var context = await _contextFactory.CreateDbContextAsync();
// 高效清空表
await context.PlayHistory.ExecuteDeleteAsync();
}
public async Task GenerateTestDataAsync(int count = 100)
{
// 这里的逻辑稍微重构了一下,使用批量插入提升性能
var random = new Random();
var presetSongs = new List<(string Title, string Artist, string Album)>
{
("Anti-Hero", "Taylor Swift", "Midnights"),
("Cruel Summer", "Taylor Swift", "Lover"),
("Blank Space", "Taylor Swift", "1989"),
("As It Was", "Harry Styles", "Harry's House"),
("Late Night Talking", "Harry Styles", "Harry's House"),
("Die For You", "The Weeknd", "Starboy"),
("Blinding Lights", "The Weeknd", "After Hours"),
("Starboy", "The Weeknd", "Starboy"),
("Shape of You", "Ed Sheeran", "Divide"),
("Bad Guy", "Billie Eilish", "When We All Fall Asleep, Where Do We Go?"),
("Flowers", "Miley Cyrus", "Endless Summer Vacation"),
("Stay", "The Kid LAROI & Justin Bieber", "F*ck Love 3: Over You"),
("七里香", "周杰伦", "七里香"),
("晴天", "周杰伦", "叶惠美"),
("一路向北", "周杰伦", "11月的肖邦"),
("告白气球", "周杰伦", "周杰伦的床边故事"),
("十年", "陈奕迅", "黑·白·灰"),
("富士山下", "陈奕迅", "What's Going On...?"),
("孤勇者", "陈奕迅", "孤勇者"),
("修炼爱情", "林俊杰", "因你而在"),
("江南", "林俊杰", "第二天堂"),
("光年之外", "G.E.M. 邓紫棋", "摩天动物园"),
("泡沫", "G.E.M. 邓紫棋", "Xposed"),
("因为爱情", "王菲 & 陈奕迅", "Stranger Under My Skin"),
("红豆", "王菲", "唱游"),
("Bohemian Rhapsody", "Queen", "A Night at the Opera"),
("Don't Stop Me Now", "Queen", "Jazz"),
("Numb", "Linkin Park", "Meteora"),
("In the End", "Linkin Park", "Hybrid Theory"),
("Yellow", "Coldplay", "Parachutes"),
("Viva La Vida", "Coldplay", "Viva La Vida"),
("Smells Like Teen Spirit", "Nirvana", "Nevermind"),
("Hotel California", "Eagles", "Hotel California"),
("Lemon", "米津玄師", "Lemon"),
("Kick Back", "米津玄師", "KICK BACK"),
("アイドル", "YOASOBI", "アイドル"),
("夜に駆ける", "YOASOBI", "THE BOOK"),
("First Love", "宇多田ヒカル", "First Love"),
("Dynamite", "BTS", "BE"),
("Butter", "BTS", "Butter"),
("How You Like That", "BLACKPINK", "The Album"),
("Ditto", "NewJeans", "OMG"),
("Get Lucky", "Daft Punk", "Random Access Memories"),
("The Nights", "Avicii", "The Days / Nights"),
("Summer", "Calvin Harris", "Motion"),
};
var playerIds = new[] { "Spotify", "Spotify", "Spotify", "MusicBee", "MusicBee", "QQMusic", "NeteaseCloudMusic", "AppleMusic" };
var batchList = new List<PlayHistoryItem>();
// 我们尝试生成 count 条有效数据
// 为了防止死循环,加个硬上限
int attempts = 0;
while (batchList.Count < count && attempts < count * 5)
{
attempts++;
var song = presetSongs[random.Next(presetSongs.Count)];
var playerId = playerIds[random.Next(playerIds.Length)];
var daysBack = random.Next(0, 365);
var hoursBack = random.Next(0, 24);
var minutesBack = random.Next(0, 60);
var secondsBack = random.Next(0, 60);
var startedAt = DateTime.UtcNow // 直接用 UTC
.AddDays(-daysBack)
.AddHours(-hoursBack)
.AddMinutes(-minutesBack)
.AddSeconds(-secondsBack);
var totalDurationMs = random.Next(180, 300) * 1000.0;
double playedRatio;
double roll = random.NextDouble();
if (roll > 0.3) playedRatio = 0.9 + (random.NextDouble() * 0.1);
else if (roll > 0.1) playedRatio = 0.3 + (random.NextDouble() * 0.5);
else playedRatio = 0.05 + (random.NextDouble() * 0.25);
var playedDurationMs = totalDurationMs * playedRatio;
// 只有听了一半以上的才算作记录
if (playedDurationMs >= (totalDurationMs / 2))
{
batchList.Add(new PlayHistoryItem
{
Title = song.Title,
Artist = song.Artist,
Album = song.Album,
PlayerId = playerId,
StartedAt = startedAt,
TotalDurationMs = totalDurationMs,
DurationPlayedMs = playedDurationMs
});
}
}
if (batchList.Count > 0)
{
using var context = await _contextFactory.CreateDbContextAsync();
await context.PlayHistory.AddRangeAsync(batchList);
await context.SaveChangesAsync();
}
}
}
}

View File

@@ -24,11 +24,13 @@ namespace BetterLyrics.WinUI3.Services.SettingsService
public partial class SettingsService : BaseViewModel, ISettingsService public partial class SettingsService : BaseViewModel, ISettingsService
{ {
private readonly DispatcherQueueTimer _writeAppSettingsTimer; private readonly DispatcherQueueTimer _writeAppSettingsTimer;
private readonly ILocalizationService _localizationService;
public AppSettings AppSettings { get; set; } public AppSettings AppSettings { get; set; }
public SettingsService() public SettingsService(ILocalizationService localizationService)
{ {
_localizationService = localizationService;
_writeAppSettingsTimer = _dispatcherQueue.CreateTimer(); _writeAppSettingsTimer = _dispatcherQueue.CreateTimer();
AppSettings = ReadAppSettings(); AppSettings = ReadAppSettings();
@@ -60,6 +62,7 @@ namespace BetterLyrics.WinUI3.Services.SettingsService
AppSettings.Version = MetadataHelper.AppVersion; AppSettings.Version = MetadataHelper.AppVersion;
EnsureMediaSourceProvidersInfo(); EnsureMediaSourceProvidersInfo();
EnsureStarredPlaylists();
} }
private void EnsureMediaSourceProvidersInfo() private void EnsureMediaSourceProvidersInfo()
@@ -102,6 +105,20 @@ namespace BetterLyrics.WinUI3.Services.SettingsService
} }
} }
private void EnsureStarredPlaylists()
{
if (!AppSettings.StarredPlaylists.Any(x => x.IsDefault))
{
AppSettings.StarredPlaylists.Insert(0, new SongsTabInfo
{
Name = _localizationService.GetLocalizedString("MusicGalleryPageAllSongs"),
Icon = "\uE8A9",
FilterProperty = CommonSongProperty.Title,
FilterValue = string.Empty
});
}
}
private void AppSettings_ItemPropertyChanged(object? sender, ItemPropertyChangedEventArgs e) private void AppSettings_ItemPropertyChanged(object? sender, ItemPropertyChangedEventArgs e)
{ {
WriteAppSettings(); WriteAppSettings();

View File

@@ -129,21 +129,12 @@
<data name="AlbumArtSearchSMTCProvider" xml:space="preserve"> <data name="AlbumArtSearchSMTCProvider" xml:space="preserve">
<value>مشغل الموسيقى</value> <value>مشغل الموسيقى</value>
</data> </data>
<data name="AllLyricsSettingsControlPictureInPicture.Content" xml:space="preserve">
<value>وضع صورة داخل صورة (PiP)</value>
</data>
<data name="AppSettingsControlGeneral.Text" xml:space="preserve"> <data name="AppSettingsControlGeneral.Text" xml:space="preserve">
<value>النافذة</value> <value>النافذة</value>
</data> </data>
<data name="ArtistsSplitHint.Text" xml:space="preserve"> <data name="ArtistsSplitHint.Text" xml:space="preserve">
<value>عند إدخال فنانين متعددين، يرجى استخدام أحد الفواصل التالية للفصل بينهم (لا تخلط بينها)</value> <value>عند إدخال فنانين متعددين، يرجى استخدام أحد الفواصل التالية للفصل بينهم (لا تخلط بينها)</value>
</data> </data>
<data name="BaseWindowHostInfoBarCheckBox.Content" xml:space="preserve">
<value>لا تظهر هذه الرسالة مرة أخرى</value>
</data>
<data name="BaseWindowMiniFlyoutItem.Text" xml:space="preserve">
<value>وضع صورة داخل صورة (PiP)</value>
</data>
<data name="Cancel" xml:space="preserve"> <data name="Cancel" xml:space="preserve">
<value>إلغاء</value> <value>إلغاء</value>
</data> </data>
@@ -168,24 +159,45 @@
<data name="DockedMode" xml:space="preserve"> <data name="DockedMode" xml:space="preserve">
<value>الوضع المثبت (Docked)</value> <value>الوضع المثبت (Docked)</value>
</data> </data>
<data name="Error" xml:space="preserve">
<value>خطأ</value>
</data>
<data name="ExportSettingsSuccess" xml:space="preserve"> <data name="ExportSettingsSuccess" xml:space="preserve">
<value>تم التصدير بنجاح</value> <value>تم التصدير بنجاح</value>
</data> </data>
<data name="FailToStartLXMusicServer" xml:space="preserve"> <data name="FailToStartLXMusicServer" xml:space="preserve">
<value>تعذر الاتصال بخادم موسيقى LX، يرجى الانتقال إلى الإعدادات - مصدر التشغيل - LX Music - خادم موسيقى LX للتحقق مما إذا تم إدخال الرابط بشكل صحيح</value> <value>تعذر الاتصال بخادم موسيقى LX، يرجى الانتقال إلى الإعدادات - مصدر التشغيل - LX Music - خادم موسيقى LX للتحقق مما إذا تم إدخال الرابط بشكل صحيح</value>
</data> </data>
<data name="FileSystemServiceCleaningCache" xml:space="preserve">
<value>تنظيف ذاكرة التخزين المؤقت...</value>
</data>
<data name="FileSystemServiceConnectFailed" xml:space="preserve">
<value>فشل الاتصال</value>
</data>
<data name="FileSystemServiceConnecting" xml:space="preserve">
<value>الاتصال جارِ...</value>
</data>
<data name="FileSystemServiceFetchingFileList" xml:space="preserve">
<value>جلب قائمة الملفات...</value>
</data>
<data name="FileSystemServiceParsing" xml:space="preserve">
<value>جاري التحليل...</value>
</data>
<data name="FileSystemServicePrepareToClean" xml:space="preserve">
<value>التحضير لتنظيف ذاكرة التخزين المؤقت...</value>
</data>
<data name="FileSystemServiceReady" xml:space="preserve">
<value>جاهز</value>
</data>
<data name="FileSystemServiceRootDirectoryWarning" xml:space="preserve">
<value>تم اكتشاف مسار الدليل الجذر. قد يحتوي فهرس القرص الكامل على عدد كبير من الملفات غير الوسائط ويتسبب في استغراق الفحص وقتاً طويلاً جداً. يوصى بتحديد دليل فرعي محدد.</value>
</data>
<data name="FileSystemServiceWaitingForScan" xml:space="preserve">
<value>في انتظار المسح...</value>
</data>
<data name="FullscreenMode" xml:space="preserve"> <data name="FullscreenMode" xml:space="preserve">
<value>وضع ملء الشاشة</value> <value>وضع ملء الشاشة</value>
</data> </data>
<data name="HostWindowClickThroughButton.Content" xml:space="preserve">
<value>قفل</value>
</data>
<data name="HostWindowClickThroughFlyoutItem.Text" xml:space="preserve">
<value>قفل</value>
</data>
<data name="HostWindowLockToolTip.Text" xml:space="preserve">
<value>قفل</value>
</data>
<data name="HostWindowMusicGalleryButtonToolTip.Content" xml:space="preserve"> <data name="HostWindowMusicGalleryButtonToolTip.Content" xml:space="preserve">
<value>مكتبة الموسيقى</value> <value>مكتبة الموسيقى</value>
</data> </data>
@@ -204,9 +216,6 @@
<data name="Jyutping" xml:space="preserve"> <data name="Jyutping" xml:space="preserve">
<value>جيتبنغ (كانتونية)</value> <value>جيتبنغ (كانتونية)</value>
</data> </data>
<data name="KeepAtLeastOneStatusDefault" xml:space="preserve">
<value>يرجى التأكد من تعيين حالة واحدة على الأقل كافتراضية</value>
</data>
<data name="LastFMAuthFailed" xml:space="preserve"> <data name="LastFMAuthFailed" xml:space="preserve">
<value>فشل التفويض، يرجى المحاولة مرة أخرى</value> <value>فشل التفويض، يرجى المحاولة مرة أخرى</value>
</data> </data>
@@ -270,18 +279,12 @@
<data name="LyricsPageSettings.Text" xml:space="preserve"> <data name="LyricsPageSettings.Text" xml:space="preserve">
<value>الإعدادات</value> <value>الإعدادات</value>
</data> </data>
<data name="LyricsPageTimelineOffsetButtonToolTip.Content" xml:space="preserve">
<value>إزاحة الجدول الزمني للكلمات</value>
</data>
<data name="LyricsPageTranslationEnabled.Description" xml:space="preserve"> <data name="LyricsPageTranslationEnabled.Description" xml:space="preserve">
<value>ستُعطى الأولوية لقراءة الترجمة داخل ملف الكلمات، وإذا لم يوجد تطابق، سيتم طلب ترجمة آلية من خادم LibreTranslate</value> <value>ستُعطى الأولوية لقراءة الترجمة داخل ملف الكلمات، وإذا لم يوجد تطابق، سيتم طلب ترجمة آلية من خادم LibreTranslate</value>
</data> </data>
<data name="LyricsPageTranslationEnabled.Header" xml:space="preserve"> <data name="LyricsPageTranslationEnabled.Header" xml:space="preserve">
<value>تفعيل الترجمة</value> <value>تفعيل الترجمة</value>
</data> </data>
<data name="LyricsPageTranslationOnly.Header" xml:space="preserve">
<value>عرض الترجمة فقط</value>
</data>
<data name="LyricsPageTranslationProviderPrefix.Header" xml:space="preserve"> <data name="LyricsPageTranslationProviderPrefix.Header" xml:space="preserve">
<value>مُزود الترجمة</value> <value>مُزود الترجمة</value>
</data> </data>
@@ -330,9 +333,6 @@
<data name="LyricsSearchControlSongInfoMapping.Text" xml:space="preserve"> <data name="LyricsSearchControlSongInfoMapping.Text" xml:space="preserve">
<value>تعيين معلومات الأغنية</value> <value>تعيين معلومات الأغنية</value>
</data> </data>
<data name="LyricsSearchControlTargetSearchProvider.Header" xml:space="preserve">
<value>مزود بحث الكلمات المستهدف</value>
</data>
<data name="LyricsSearchControlTitle.Header" xml:space="preserve"> <data name="LyricsSearchControlTitle.Header" xml:space="preserve">
<value>العنوان</value> <value>العنوان</value>
</data> </data>
@@ -351,15 +351,9 @@
<data name="LyricsSearchProviderTtmlFile" xml:space="preserve"> <data name="LyricsSearchProviderTtmlFile" xml:space="preserve">
<value>ملف TTML محلي</value> <value>ملف TTML محلي</value>
</data> </data>
<data name="LyricsWindowImmersiveButtonToolTip.Content" xml:space="preserve">
<value>الوضع الغامر</value>
</data>
<data name="LyricsWindowSettingsControlLyricsWindowConfig.Text" xml:space="preserve"> <data name="LyricsWindowSettingsControlLyricsWindowConfig.Text" xml:space="preserve">
<value>التكوين</value> <value>التكوين</value>
</data> </data>
<data name="LyricsWindowSettingsControlLyricsWindowMode.Header" xml:space="preserve">
<value>وضع نافذة الكلمات</value>
</data>
<data name="LyricsWindowSettingsControlSetDefault.Text" xml:space="preserve"> <data name="LyricsWindowSettingsControlSetDefault.Text" xml:space="preserve">
<value>تعيين كافتراضي</value> <value>تعيين كافتراضي</value>
</data> </data>
@@ -378,9 +372,6 @@
<data name="MainPageAlbumArtOnly.Content" xml:space="preserve"> <data name="MainPageAlbumArtOnly.Content" xml:space="preserve">
<value>إظهار منطقة غلاف الألبوم فقط</value> <value>إظهار منطقة غلاف الألبوم فقط</value>
</data> </data>
<data name="MainPageEnterImmersiveModeHint" xml:space="preserve">
<value>حرك المؤشر مرة أخرى لإظهار زر التبديل</value>
</data>
<data name="MainPageLyriscOnly.Content" xml:space="preserve"> <data name="MainPageLyriscOnly.Content" xml:space="preserve">
<value>إظهار الكلمات فقط</value> <value>إظهار الكلمات فقط</value>
</data> </data>
@@ -396,6 +387,18 @@
<data name="MainPageSplitView.Content" xml:space="preserve"> <data name="MainPageSplitView.Content" xml:space="preserve">
<value>عرض مقسم</value> <value>عرض مقسم</value>
</data> </data>
<data name="MediaSettingsControlLastSyncTime.Header" xml:space="preserve">
<value>آخر مزامنة للوقت</value>
</data>
<data name="MediaSettingsControlLocalFolder" xml:space="preserve">
<value>المجلد المحلي</value>
</data>
<data name="MediaSettingsControlNameSetting.Header" xml:space="preserve">
<value>الاسم</value>
</data>
<data name="MediaSettingsControlSyncNow.Content" xml:space="preserve">
<value>مزامنة الآن</value>
</data>
<data name="MusicGalleryPageAddToCustomList.Text" xml:space="preserve"> <data name="MusicGalleryPageAddToCustomList.Text" xml:space="preserve">
<value>إضافة إلى قائمة التشغيل</value> <value>إضافة إلى قائمة التشغيل</value>
</data> </data>
@@ -406,11 +409,17 @@
<value>العنصر التالي</value> <value>العنصر التالي</value>
</data> </data>
<data name="MusicGalleryPageAddToPlayingQueue.Text" xml:space="preserve"> <data name="MusicGalleryPageAddToPlayingQueue.Text" xml:space="preserve">
<value>إضافة إلى قائمة الانتظار</value> <value>إضافة إلى قائمة انتظار اللعب</value>
</data> </data>
<data name="MusicGalleryPageAllSongs" xml:space="preserve"> <data name="MusicGalleryPageAllSongs" xml:space="preserve">
<value>كل الموسيقى</value> <value>كل الموسيقى</value>
</data> </data>
<data name="MusicGalleryPageDataSync.Message" xml:space="preserve">
<value>مزامنة مكتبة الوسائط جارية...</value>
</data>
<data name="MusicGalleryPageDataSyncError.Message" xml:space="preserve">
<value>توجد مشكلة في مزامنة مكتبة الوسائط</value>
</data>
<data name="MusicGalleryPageEmptyPlayingQueue.Text" xml:space="preserve"> <data name="MusicGalleryPageEmptyPlayingQueue.Text" xml:space="preserve">
<value>مسح قائمة الانتظار</value> <value>مسح قائمة الانتظار</value>
</data> </data>
@@ -420,9 +429,6 @@
<data name="MusicGalleryPageFileArtist.Header" xml:space="preserve"> <data name="MusicGalleryPageFileArtist.Header" xml:space="preserve">
<value>الفنان</value> <value>الفنان</value>
</data> </data>
<data name="MusicGalleryPageFileInfo.Text" xml:space="preserve">
<value>معلومات الملف</value>
</data>
<data name="MusicGalleryPageFileInfoBitDepth.Header" xml:space="preserve"> <data name="MusicGalleryPageFileInfoBitDepth.Header" xml:space="preserve">
<value>عمق البت (Bit Depth)</value> <value>عمق البت (Bit Depth)</value>
</data> </data>
@@ -456,15 +462,15 @@
<data name="MusicGalleryPageFileNotFound.Text" xml:space="preserve"> <data name="MusicGalleryPageFileNotFound.Text" xml:space="preserve">
<value>لم يتم العثور على أغاني في مكتبة الوسائط</value> <value>لم يتم العثور على أغاني في مكتبة الوسائط</value>
</data> </data>
<data name="MusicGalleryPageFolder.Text" xml:space="preserve">
<value>المجلدات</value>
</data>
<data name="MusicGalleryPageImportFromFile.Text" xml:space="preserve"> <data name="MusicGalleryPageImportFromFile.Text" xml:space="preserve">
<value>استيراد من ملف</value> <value>استيراد من ملف</value>
</data> </data>
<data name="MusicGalleryPageNewPlaylist.Text" xml:space="preserve"> <data name="MusicGalleryPageNewPlaylist.Text" xml:space="preserve">
<value>إنشاء قائمة تشغيل</value> <value>إنشاء قائمة تشغيل</value>
</data> </data>
<data name="MusicGalleryPagePlayAll.Content" xml:space="preserve">
<value>تشغيل الكل</value>
</data>
<data name="MusicGalleryPagePlayingQueue.Text" xml:space="preserve"> <data name="MusicGalleryPagePlayingQueue.Text" xml:space="preserve">
<value>قائمة الانتظار</value> <value>قائمة الانتظار</value>
</data> </data>
@@ -472,7 +478,7 @@
<value>قائمة الانتظار فارغة</value> <value>قائمة الانتظار فارغة</value>
</data> </data>
<data name="MusicGalleryPagePlaylist.Text" xml:space="preserve"> <data name="MusicGalleryPagePlaylist.Text" xml:space="preserve">
<value>قائمة التشغيل</value> <value>قوائم التشغيل</value>
</data> </data>
<data name="MusicGalleryPageQueueLoop.Text" xml:space="preserve"> <data name="MusicGalleryPageQueueLoop.Text" xml:space="preserve">
<value>تكرار القائمة</value> <value>تكرار القائمة</value>
@@ -489,9 +495,6 @@
<data name="MusicGalleryPageScrollToPlayingItem.Text" xml:space="preserve"> <data name="MusicGalleryPageScrollToPlayingItem.Text" xml:space="preserve">
<value>التمرير إلى العنصر المشغل</value> <value>التمرير إلى العنصر المشغل</value>
</data> </data>
<data name="MusicGalleryPageSelectAll.Content" xml:space="preserve">
<value>تحديد الكل</value>
</data>
<data name="MusicGalleryPageSingleLoop.Text" xml:space="preserve"> <data name="MusicGalleryPageSingleLoop.Text" xml:space="preserve">
<value>تكرار أغنية واحدة</value> <value>تكرار أغنية واحدة</value>
</data> </data>
@@ -513,20 +516,29 @@
<data name="MusicGalleryPageSortType.Text" xml:space="preserve"> <data name="MusicGalleryPageSortType.Text" xml:space="preserve">
<value>نوع الفرز</value> <value>نوع الفرز</value>
</data> </data>
<data name="MusicGalleryPageStarredPlaylist.Content" xml:space="preserve">
<value>قوائم التشغيل المميزة بنجمة</value>
</data>
<data name="MusicGalleryPageStopTrack.Text" xml:space="preserve"> <data name="MusicGalleryPageStopTrack.Text" xml:space="preserve">
<value>إيقاف</value> <value>إيقاف</value>
</data> </data>
<data name="MusicGalleryPageTitle" xml:space="preserve"> <data name="MusicGalleryPageTitle" xml:space="preserve">
<value>مكتبة الموسيقى - BetterLyrics</value> <value>مكتبة الموسيقى - BetterLyrics</value>
</data> </data>
<data name="MusicGalleryWindowDownButtonToolTip.Content" xml:space="preserve"> <data name="MusicSettingsControlAutoSyncInterval.Header" xml:space="preserve">
<value>سحب</value> <value>تردد المزامنة التلقائية</value>
</data> </data>
<data name="MusicGalleryWindowUpButtonToolTip.Content" xml:space="preserve"> <data name="MusicSettingsControlAutoSyncIntervalDisabled.Content" xml:space="preserve">
<value>توسيع</value> <value>مطلقًا</value>
</data>
<data name="MusicSettingsControlAutoSyncIntervalEveryDay.Content" xml:space="preserve">
<value>كل يوم</value>
</data>
<data name="MusicSettingsControlAutoSyncIntervalEveryFifteenMin.Content" xml:space="preserve">
<value>كل 15 دقيقة</value>
</data>
<data name="MusicSettingsControlAutoSyncIntervalEveryHour.Content" xml:space="preserve">
<value>كُل ساعة</value>
</data>
<data name="MusicSettingsControlAutoSyncIntervalEverySixHrs.Content" xml:space="preserve">
<value>كُل 6 ساعات</value>
</data> </data>
<data name="NarrowMode" xml:space="preserve"> <data name="NarrowMode" xml:space="preserve">
<value>وضع الشاشة الضيقة</value> <value>وضع الشاشة الضيقة</value>
@@ -543,12 +555,27 @@
<data name="PrivacyPolicy.Content" xml:space="preserve"> <data name="PrivacyPolicy.Content" xml:space="preserve">
<value>سياسة الخصوصية</value> <value>سياسة الخصوصية</value>
</data> </data>
<data name="RemoteServerConfigControlBrowse.Content" xml:space="preserve">
<value>تصفح</value>
</data>
<data name="RemoteServerConfigControlName.Header" xml:space="preserve">
<value>الاسم</value>
</data>
<data name="RemoteServerConfigControlName.PlaceholderText" xml:space="preserve">
<value>سيؤدي تركه فارغاً إلى إنشاء اسم افتراضي تلقائياً.</value>
</data>
<data name="RemoteServerConfigControlPassword.Header" xml:space="preserve"> <data name="RemoteServerConfigControlPassword.Header" xml:space="preserve">
<value>كلمة المرور</value> <value>كلمة المرور</value>
</data> </data>
<data name="RemoteServerConfigControlPath.Header" xml:space="preserve"> <data name="RemoteServerConfigControlPath.Header" xml:space="preserve">
<value>المسار</value> <value>المسار</value>
</data> </data>
<data name="RemoteServerConfigControlPathNotExisted" xml:space="preserve">
<value>تعذر العثور على مسار المجلد المحدد</value>
</data>
<data name="RemoteServerConfigControlPathRequired" xml:space="preserve">
<value>المسار مطلوب</value>
</data>
<data name="RemoteServerConfigControlPort.Header" xml:space="preserve"> <data name="RemoteServerConfigControlPort.Header" xml:space="preserve">
<value>المنفذ</value> <value>المنفذ</value>
</data> </data>
@@ -576,9 +603,6 @@
<data name="SetingsPageFeedback.Text" xml:space="preserve"> <data name="SetingsPageFeedback.Text" xml:space="preserve">
<value>تعليقات</value> <value>تعليقات</value>
</data> </data>
<data name="SetingsPageInstructions.Text" xml:space="preserve">
<value>دليل التشغيل</value>
</data>
<data name="SetingsPageSpecialThanks.Text" xml:space="preserve"> <data name="SetingsPageSpecialThanks.Text" xml:space="preserve">
<value>شكر خاص</value> <value>شكر خاص</value>
</data> </data>
@@ -606,9 +630,6 @@
<data name="SettingsPageAddFolderButton.Content" xml:space="preserve"> <data name="SettingsPageAddFolderButton.Content" xml:space="preserve">
<value>إضافة</value> <value>إضافة</value>
</data> </data>
<data name="SettingsPageAdvanced.Text" xml:space="preserve">
<value>خيارات متقدمة</value>
</data>
<data name="SettingsPageAlbum.Header" xml:space="preserve"> <data name="SettingsPageAlbum.Header" xml:space="preserve">
<value>الألبوم</value> <value>الألبوم</value>
</data> </data>
@@ -624,15 +645,9 @@
<data name="SettingsPageAlbumArtSearchProvidersConfig.Text" xml:space="preserve"> <data name="SettingsPageAlbumArtSearchProvidersConfig.Text" xml:space="preserve">
<value>تكوين مصادر غلاف الألبوم</value> <value>تكوين مصادر غلاف الألبوم</value>
</data> </data>
<data name="SettingsPageAlbumArtSize.Header" xml:space="preserve">
<value>حجم غلاف الألبوم</value>
</data>
<data name="SettingsPageAlbumEffect.Text" xml:space="preserve"> <data name="SettingsPageAlbumEffect.Text" xml:space="preserve">
<value>تأثير غلاف الألبوم</value> <value>تأثير غلاف الألبوم</value>
</data> </data>
<data name="SettingsPageAlbumLib.Content" xml:space="preserve">
<value>مصدر غلاف الألبوم</value>
</data>
<data name="SettingsPageAlbumRadius.Header" xml:space="preserve"> <data name="SettingsPageAlbumRadius.Header" xml:space="preserve">
<value>نصف قطر الزاوية</value> <value>نصف قطر الزاوية</value>
</data> </data>
@@ -663,12 +678,6 @@
<data name="SettingsPageAppAppearance.Text" xml:space="preserve"> <data name="SettingsPageAppAppearance.Text" xml:space="preserve">
<value>مظهر التطبيق</value> <value>مظهر التطبيق</value>
</data> </data>
<data name="SettingsPageAppBehavior.Text" xml:space="preserve">
<value>السلوك العام</value>
</data>
<data name="SettingsPageApply.Content" xml:space="preserve">
<value>تطبيق</value>
</data>
<data name="SettingsPageArtist.Header" xml:space="preserve"> <data name="SettingsPageArtist.Header" xml:space="preserve">
<value>الفنان</value> <value>الفنان</value>
</data> </data>
@@ -687,23 +696,14 @@
<data name="SettingsPageAutoStart.Header" xml:space="preserve"> <data name="SettingsPageAutoStart.Header" xml:space="preserve">
<value>بدء التشغيل التلقائي</value> <value>بدء التشغيل التلقائي</value>
</data> </data>
<data name="SettingsPageAutoStartWindow.Header" xml:space="preserve">
<value>عند بدء تشغيل التطبيق</value>
</data>
<data name="SettingsPageBackdrop.Header" xml:space="preserve">
<value>مادة خلفية الكلمات</value>
</data>
<data name="SettingsPageBackgroundOverlay.Text" xml:space="preserve"> <data name="SettingsPageBackgroundOverlay.Text" xml:space="preserve">
<value>خلفية الكلمات</value> <value>خلفية الكلمات</value>
</data> </data>
<data name="SettingsPageBlurAmount.Header" xml:space="preserve"> <data name="SettingsPageBlurAmount.Header" xml:space="preserve">
<value>كمية الضبابية (Blur)</value> <value>كمية الضبابية (Blur)</value>
</data> </data>
<data name="SettingsPageBorderless.Header" xml:space="preserve">
<value>نافذة بلا حدود</value>
</data>
<data name="SettingsPageCache.Description" xml:space="preserve"> <data name="SettingsPageCache.Description" xml:space="preserve">
<value>يشمل ملفات السجل وذاكرة التخزين المؤقت للكلمات عبر الشبكة</value> <value>يتضمن ملفات السجلات، وذاكرة التخزين المؤقت للكلمات عبر الإنترنت</value>
</data> </data>
<data name="SettingsPageCache.Header" xml:space="preserve"> <data name="SettingsPageCache.Header" xml:space="preserve">
<value>ذاكرة التخزين المؤقت (Cache)</value> <value>ذاكرة التخزين المؤقت (Cache)</value>
@@ -738,9 +738,6 @@
<data name="SettingsPageCollapseDropdown.Content" xml:space="preserve"> <data name="SettingsPageCollapseDropdown.Content" xml:space="preserve">
<value>طي القائمة المنسدلة</value> <value>طي القائمة المنسدلة</value>
</data> </data>
<data name="SettingsPageCompactTitleBar.Content" xml:space="preserve">
<value>مدمج</value>
</data>
<data name="SettingsPageConfigName.Description" xml:space="preserve"> <data name="SettingsPageConfigName.Description" xml:space="preserve">
<value>تسمية حالة النافذة المسجلة يمكن أن تساعدك على تمييزها بشكل أفضل</value> <value>تسمية حالة النافذة المسجلة يمكن أن تساعدك على تمييزها بشكل أفضل</value>
</data> </data>
@@ -759,18 +756,12 @@
<data name="SettingsPageCrossfade.Content" xml:space="preserve"> <data name="SettingsPageCrossfade.Content" xml:space="preserve">
<value>تلاشي متقاطع (Crossfade)</value> <value>تلاشي متقاطع (Crossfade)</value>
</data> </data>
<data name="SettingsPageCurrentLyricsWindowStatus.Text" xml:space="preserve">
<value>حالة نافذة الكلمات الحالية</value>
</data>
<data name="SettingsPageCutletDockerServer.Header" xml:space="preserve"> <data name="SettingsPageCutletDockerServer.Header" xml:space="preserve">
<value>خدمة النقل الصوتي cutlet-docker</value> <value>خدمة النقل الصوتي cutlet-docker</value>
</data> </data>
<data name="SettingsPageDark.Content" xml:space="preserve"> <data name="SettingsPageDark.Content" xml:space="preserve">
<value>داكن</value> <value>داكن</value>
</data> </data>
<data name="SettingsPageDebugOverlay.Header" xml:space="preserve">
<value>إظهار تراكب التصحيح (Debug)</value>
</data>
<data name="SettingsPageDelete.Text" xml:space="preserve"> <data name="SettingsPageDelete.Text" xml:space="preserve">
<value>حذف</value> <value>حذف</value>
</data> </data>
@@ -801,15 +792,9 @@
<data name="SettingsPageDockPlacementTop.Content" xml:space="preserve"> <data name="SettingsPageDockPlacementTop.Content" xml:space="preserve">
<value>أعلى</value> <value>أعلى</value>
</data> </data>
<data name="SettingsPageDockWindowHeight.Header" xml:space="preserve">
<value>ارتفاع النافذة</value>
</data>
<data name="SettingsPageDragArea.Header" xml:space="preserve"> <data name="SettingsPageDragArea.Header" xml:space="preserve">
<value>منطقة قابلة للسحب</value> <value>منطقة قابلة للسحب</value>
</data> </data>
<data name="SettingsPageEasingFuncType.Header" xml:space="preserve">
<value>نوع حركة التسهيل (Easing)</value>
</data>
<data name="SettingsPageEasingTypeEaseInOutBack.Content" xml:space="preserve"> <data name="SettingsPageEasingTypeEaseInOutBack.Content" xml:space="preserve">
<value>EaseInOutBack</value> <value>EaseInOutBack</value>
</data> </data>
@@ -873,18 +858,15 @@
<data name="SettingsPageExitOnLyricsWindowClosed.Header" xml:space="preserve"> <data name="SettingsPageExitOnLyricsWindowClosed.Header" xml:space="preserve">
<value>الخروج من البرنامج عند إغلاق نافذة الكلمات</value> <value>الخروج من البرنامج عند إغلاق نافذة الكلمات</value>
</data> </data>
<data name="SettingsPageExportPlayHistoryButton.Content" xml:space="preserve">
<value>تصدير تاريخ اللعب</value>
</data>
<data name="SettingsPageExportSettingsButton.Content" xml:space="preserve"> <data name="SettingsPageExportSettingsButton.Content" xml:space="preserve">
<value>تصدير الإعدادات</value> <value>تصدير الإعدادات</value>
</data> </data>
<data name="SettingsPageExtendedTitleBar.Content" xml:space="preserve">
<value>موسع</value>
</data>
<data name="SettingsPageFan.Header" xml:space="preserve"> <data name="SettingsPageFan.Header" xml:space="preserve">
<value>كلمات مروحية الشكل</value> <value>كلمات مروحية الشكل</value>
</data> </data>
<data name="SettingsPageFAQ.Content" xml:space="preserve">
<value>الأسئلة الشائعة</value>
</data>
<data name="SettingsPageFixedTimeStep.Header" xml:space="preserve"> <data name="SettingsPageFixedTimeStep.Header" xml:space="preserve">
<value>تصيير بخطوة زمنية ثابتة</value> <value>تصيير بخطوة زمنية ثابتة</value>
</data> </data>
@@ -921,9 +903,6 @@
<data name="SettingsPageHeight.Header" xml:space="preserve"> <data name="SettingsPageHeight.Header" xml:space="preserve">
<value>الارتفاع</value> <value>الارتفاع</value>
</data> </data>
<data name="SettingsPageHello.Text" xml:space="preserve">
<value>مرحباً</value>
</data>
<data name="SettingsPageHelpUsTranslate.Content" xml:space="preserve"> <data name="SettingsPageHelpUsTranslate.Content" xml:space="preserve">
<value>ساعدنا في ترجمة هذا التطبيق</value> <value>ساعدنا في ترجمة هذا التطبيق</value>
</data> </data>
@@ -954,9 +933,6 @@
<data name="SettingsPageJapanese.Header" xml:space="preserve"> <data name="SettingsPageJapanese.Header" xml:space="preserve">
<value>الصوتيات اليابانية</value> <value>الصوتيات اليابانية</value>
</data> </data>
<data name="SettingsPageJoinNowButton.Content" xml:space="preserve">
<value>انضم الآن</value>
</data>
<data name="SettingsPageJyutping.Content" xml:space="preserve"> <data name="SettingsPageJyutping.Content" xml:space="preserve">
<value>جيتبنغ (كانتونية)</value> <value>جيتبنغ (كانتونية)</value>
</data> </data>
@@ -1005,18 +981,12 @@
<data name="SettingsPageLight.Content" xml:space="preserve"> <data name="SettingsPageLight.Content" xml:space="preserve">
<value>فاتح</value> <value>فاتح</value>
</data> </data>
<data name="SettingsPageLinkedFile.Text" xml:space="preserve">
<value>الملفات المحلية المرتبطة</value>
</data>
<data name="SettingsPageListenNewSession.Header" xml:space="preserve"> <data name="SettingsPageListenNewSession.Header" xml:space="preserve">
<value>تمكين الاستماع لمصادر التشغيل الجديدة</value> <value>تمكين الاستماع لمصادر التشغيل الجديدة</value>
</data> </data>
<data name="SettingsPageLocalFolder.Text" xml:space="preserve"> <data name="SettingsPageLocalFolder.Text" xml:space="preserve">
<value>مجلد محلي</value> <value>مجلد محلي</value>
</data> </data>
<data name="SettingsPageLog.Header" xml:space="preserve">
<value>التسجيل (Log)</value>
</data>
<data name="SettingsPageLongSyllableDuration.Header" xml:space="preserve"> <data name="SettingsPageLongSyllableDuration.Header" xml:space="preserve">
<value>عتبة المقطع الطويل</value> <value>عتبة المقطع الطويل</value>
</data> </data>
@@ -1071,15 +1041,6 @@
<data name="SettingsPageLyricsFgFontColor.Header" xml:space="preserve"> <data name="SettingsPageLyricsFgFontColor.Header" xml:space="preserve">
<value>السطر الحالي</value> <value>السطر الحالي</value>
</data> </data>
<data name="SettingsPageLyricsFgFontColorAdaptiveColored.Content" xml:space="preserve">
<value>التكيف مع خلفية الكلمات (ملون)</value>
</data>
<data name="SettingsPageLyricsFgFontColorAdaptiveGrayed.Content" xml:space="preserve">
<value>التكيف مع خلفية الكلمات (رمادي)</value>
</data>
<data name="SettingsPageLyricsFgFontColorCustom.Content" xml:space="preserve">
<value>مخصص</value>
</data>
<data name="SettingsPageLyricsFloatAnimation.Header" xml:space="preserve"> <data name="SettingsPageLyricsFloatAnimation.Header" xml:space="preserve">
<value>الرسوم المتحركة العائمة</value> <value>الرسوم المتحركة العائمة</value>
</data> </data>
@@ -1107,27 +1068,12 @@
<data name="SettingsPageLyricsGlowEffect.Header" xml:space="preserve"> <data name="SettingsPageLyricsGlowEffect.Header" xml:space="preserve">
<value>تأثير التوهج</value> <value>تأثير التوهج</value>
</data> </data>
<data name="SettingsPageLyricsHighlight.Header" xml:space="preserve">
<value>تمييز</value>
</data>
<data name="SettingsPageLyricsHighlightScope.Header" xml:space="preserve">
<value>نطاق تمييز النص الأصلي</value>
</data>
<data name="SettingsPageLyricsLeft.Content" xml:space="preserve">
<value>يسار</value>
</data>
<data name="SettingsPageLyricsLight.Content" xml:space="preserve"> <data name="SettingsPageLyricsLight.Content" xml:space="preserve">
<value>خفيف</value> <value>خفيف</value>
</data> </data>
<data name="SettingsPageLyricsLineFade.Header" xml:space="preserve">
<value>تدرج حافة منطقة التشغيل</value>
</data>
<data name="SettingsPageLyricsLineSpacingFactor.Header" xml:space="preserve"> <data name="SettingsPageLyricsLineSpacingFactor.Header" xml:space="preserve">
<value>تباعد الأسطر</value> <value>تباعد الأسطر</value>
</data> </data>
<data name="SettingsPageLyricsLineSpacingFactorUnit.Text" xml:space="preserve">
<value> مرات ارتفاع السطر</value>
</data>
<data name="SettingsPageLyricsMedium.Content" xml:space="preserve"> <data name="SettingsPageLyricsMedium.Content" xml:space="preserve">
<value>متوسط</value> <value>متوسط</value>
</data> </data>
@@ -1170,9 +1116,6 @@
<data name="SettingsPageLyricsSemiLight.Content" xml:space="preserve"> <data name="SettingsPageLyricsSemiLight.Content" xml:space="preserve">
<value>شبه خفيف</value> <value>شبه خفيف</value>
</data> </data>
<data name="SettingsPageLyricsShadow.Header" xml:space="preserve">
<value>الظل</value>
</data>
<data name="SettingsPageLyricsStyle.Text" xml:space="preserve"> <data name="SettingsPageLyricsStyle.Text" xml:space="preserve">
<value>نمط الكلمات</value> <value>نمط الكلمات</value>
</data> </data>
@@ -1188,30 +1131,15 @@
<data name="SettingsPageLyricsTimelineThreshold.Header" xml:space="preserve"> <data name="SettingsPageLyricsTimelineThreshold.Header" xml:space="preserve">
<value>عتبة مزامنة الجدول الزمني للكلمات</value> <value>عتبة مزامنة الجدول الزمني للكلمات</value>
</data> </data>
<data name="SettingsPageLyricsTranslationHighlight.Header" xml:space="preserve">
<value>تمييز الترجمة</value>
</data>
<data name="SettingsPageLyricsTranslationSeparator.Header" xml:space="preserve">
<value>فاصل النص الأصلي والمترجم</value>
</data>
<data name="SettingsPageLyricsVerticalEdgeOpacity.Header" xml:space="preserve">
<value>شفافية الحافة الرأسية</value>
</data>
<data name="SettingsPageLyricsWindow.Text" xml:space="preserve"> <data name="SettingsPageLyricsWindow.Text" xml:space="preserve">
<value>نافذة الكلمات</value> <value>نافذة الكلمات</value>
</data> </data>
<data name="SettingsPageLyricsWindowManager.Text" xml:space="preserve">
<value>مدير نافذة الكلمات</value>
</data>
<data name="SettingsPageLyricsWindowMgr.Content" xml:space="preserve"> <data name="SettingsPageLyricsWindowMgr.Content" xml:space="preserve">
<value>مدير نافذة الكلمات</value> <value>مدير نافذة الكلمات</value>
</data> </data>
<data name="SettingsPageLyricsWindowSwitchHotKey.Header" xml:space="preserve"> <data name="SettingsPageLyricsWindowSwitchHotKey.Header" xml:space="preserve">
<value>اختصار تبديل حالة نافذة الكلمات</value> <value>اختصار تبديل حالة نافذة الكلمات</value>
</data> </data>
<data name="SettingsPageLyricsWindowToolTip.Content" xml:space="preserve">
<value>نافذة الكلمات</value>
</data>
<data name="SettingsPageMatchingThreshold.Description" xml:space="preserve"> <data name="SettingsPageMatchingThreshold.Description" xml:space="preserve">
<value>سيؤثر ضبط هذه القيمة على نتائج البحث المتسلسل والبحث بأفضل تطابق، ولكنه لن يؤثر على نتائج البحث في واجهة البحث اليدوي عن الكلمات</value> <value>سيؤثر ضبط هذه القيمة على نتائج البحث المتسلسل والبحث بأفضل تطابق، ولكنه لن يؤثر على نتائج البحث في واجهة البحث اليدوي عن الكلمات</value>
</data> </data>
@@ -1248,18 +1176,12 @@
<data name="SettingsPageMusicLib.Header" xml:space="preserve"> <data name="SettingsPageMusicLib.Header" xml:space="preserve">
<value>مكتبة الوسائط المحلية</value> <value>مكتبة الوسائط المحلية</value>
</data> </data>
<data name="SettingsPageMusicLibRealTimeWatch.Header" xml:space="preserve">
<value>مراقبة تغييرات الملفات في الوقت الحقيقي</value>
</data>
<data name="SettingsPageNarrowMode.Text" xml:space="preserve"> <data name="SettingsPageNarrowMode.Text" xml:space="preserve">
<value>وضع الشاشة الضيقة</value> <value>وضع الشاشة الضيقة</value>
</data> </data>
<data name="SettingsPageNextSongHotKey.Header" xml:space="preserve"> <data name="SettingsPageNextSongHotKey.Header" xml:space="preserve">
<value>اختصار الأغنية التالية</value> <value>اختصار الأغنية التالية</value>
</data> </data>
<data name="SettingsPageNoBackdrop.Content" xml:space="preserve">
<value>لا شيء</value>
</data>
<data name="SettingsPageOctTree.Content" xml:space="preserve"> <data name="SettingsPageOctTree.Content" xml:space="preserve">
<value>عدواني</value> <value>عدواني</value>
</data> </data>
@@ -1287,9 +1209,6 @@
<data name="SettingsPagePathIncludingOthersInfo" xml:space="preserve"> <data name="SettingsPagePathIncludingOthersInfo" xml:space="preserve">
<value>يحتوي هذا المجلد على مجلدات مضافة مسبقاً، يرجى حذف تلك المجلدات لإضافة هذا المجلد</value> <value>يحتوي هذا المجلد على مجلدات مضافة مسبقاً، يرجى حذف تلك المجلدات لإضافة هذا المجلد</value>
</data> </data>
<data name="SettingsPagePathNotFound.Text" xml:space="preserve">
<value>لا يمكن العثور على المسار في جهاز الكمبيوتر الخاص بك</value>
</data>
<data name="SettingsPagePatrons.Text" xml:space="preserve"> <data name="SettingsPagePatrons.Text" xml:space="preserve">
<value>الرعاة</value> <value>الرعاة</value>
</data> </data>
@@ -1335,15 +1254,9 @@
<data name="SettingsPageRealtimeStatus.Text" xml:space="preserve"> <data name="SettingsPageRealtimeStatus.Text" xml:space="preserve">
<value>الحالة في الوقت الحقيقي</value> <value>الحالة في الوقت الحقيقي</value>
</data> </data>
<data name="SettingsPageRecord.Content" xml:space="preserve">
<value>سجل</value>
</data>
<data name="SettingsPageRecordedWindowStatus.Text" xml:space="preserve"> <data name="SettingsPageRecordedWindowStatus.Text" xml:space="preserve">
<value>حالة النافذة المسجلة</value> <value>حالة النافذة المسجلة</value>
</data> </data>
<data name="SettingsPageReference.Header" xml:space="preserve">
<value>روابط مرجعية</value>
</data>
<data name="SettingsPageRefreshDropdown.Content" xml:space="preserve"> <data name="SettingsPageRefreshDropdown.Content" xml:space="preserve">
<value>تحديث القائمة المنسدلة</value> <value>تحديث القائمة المنسدلة</value>
</data> </data>
@@ -1362,9 +1275,6 @@
<data name="SettingsPageRight.Content" xml:space="preserve"> <data name="SettingsPageRight.Content" xml:space="preserve">
<value>يمين</value> <value>يمين</value>
</data> </data>
<data name="SettingsPageRomaji.Header" xml:space="preserve">
<value>الصوتيات اليابانية</value>
</data>
<data name="SettingsPageScope.Header" xml:space="preserve"> <data name="SettingsPageScope.Header" xml:space="preserve">
<value>النطاق</value> <value>النطاق</value>
</data> </data>
@@ -1404,6 +1314,9 @@
<data name="SettingsPageSettingsManager.Header" xml:space="preserve"> <data name="SettingsPageSettingsManager.Header" xml:space="preserve">
<value>مدير الإعدادات</value> <value>مدير الإعدادات</value>
</data> </data>
<data name="SettingsPageSettingsPlayHistory.Header" xml:space="preserve">
<value>تاريخ اللعب</value>
</data>
<data name="SettingsPageShareHub.Content" xml:space="preserve"> <data name="SettingsPageShareHub.Content" xml:space="preserve">
<value>تصفح مركز مشاركة الموارد عبر الإنترنت</value> <value>تصفح مركز مشاركة الموارد عبر الإنترنت</value>
</data> </data>
@@ -1431,18 +1344,12 @@
<data name="SettingsPageShowInSwitchers.Header" xml:space="preserve"> <data name="SettingsPageShowInSwitchers.Header" xml:space="preserve">
<value>إظهار في بيئة النظام</value> <value>إظهار في بيئة النظام</value>
</data> </data>
<data name="SettingsPageShowLayoutDragger.Header" xml:space="preserve">
<value>إظهار مقسم التخطيط</value>
</data>
<data name="SettingsPageShowTitle.Header" xml:space="preserve"> <data name="SettingsPageShowTitle.Header" xml:space="preserve">
<value>إظهار العنوان</value> <value>إظهار العنوان</value>
</data> </data>
<data name="SettingsPageSlide.Content" xml:space="preserve"> <data name="SettingsPageSlide.Content" xml:space="preserve">
<value>انزلاق (Slide)</value> <value>انزلاق (Slide)</value>
</data> </data>
<data name="SettingsPageSliderPrefix.Text" xml:space="preserve">
<value>القيمة الحالية: </value>
</data>
<data name="SettingsPageSnowFlakeLayer.Header" xml:space="preserve"> <data name="SettingsPageSnowFlakeLayer.Header" xml:space="preserve">
<value>طبقة الثلج</value> <value>طبقة الثلج</value>
</data> </data>
@@ -1485,6 +1392,9 @@
<data name="SettingsPageStartup.Text" xml:space="preserve"> <data name="SettingsPageStartup.Text" xml:space="preserve">
<value>بدء التشغيل</value> <value>بدء التشغيل</value>
</data> </data>
<data name="SettingsPageStats.Content" xml:space="preserve">
<value>الإحصائيات</value>
</data>
<data name="SettingsPageStopTrackOnGalleryWindowClosed.Header" xml:space="preserve"> <data name="SettingsPageStopTrackOnGalleryWindowClosed.Header" xml:space="preserve">
<value>إيقاف التشغيل عند إغلاق نافذة مكتبة الموسيقى</value> <value>إيقاف التشغيل عند إغلاق نافذة مكتبة الموسيقى</value>
</data> </data>
@@ -1503,9 +1413,6 @@
<data name="SettingsPageTaskbarPlacement.Header" xml:space="preserve"> <data name="SettingsPageTaskbarPlacement.Header" xml:space="preserve">
<value>موضع تثبيت شريط المهام</value> <value>موضع تثبيت شريط المهام</value>
</data> </data>
<data name="SettingsPageThanksForPurchasing.Text" xml:space="preserve">
<value>شكراً لشرائك BetterLyrics</value>
</data>
<data name="SettingsPageThanksList.Header" xml:space="preserve"> <data name="SettingsPageThanksList.Header" xml:space="preserve">
<value>قائمة الشكر</value> <value>قائمة الشكر</value>
</data> </data>
@@ -1524,12 +1431,6 @@
<data name="SettingsPageTitleBarAreaWhole.Content" xml:space="preserve"> <data name="SettingsPageTitleBarAreaWhole.Content" xml:space="preserve">
<value>كامل النافذة</value> <value>كامل النافذة</value>
</data> </data>
<data name="SettingsPageTitleBarType.Header" xml:space="preserve">
<value>حجم شريط العنوان</value>
</data>
<data name="SettingsPageToggleHotKey.Header" xml:space="preserve">
<value>اختصار التبديل للداخل والخارج</value>
</data>
<data name="SettingsPageTranslatedText.Header" xml:space="preserve"> <data name="SettingsPageTranslatedText.Header" xml:space="preserve">
<value>الترجمة</value> <value>الترجمة</value>
</data> </data>
@@ -1539,9 +1440,6 @@
<data name="SettingsPageTranslationConfig.Header" xml:space="preserve"> <data name="SettingsPageTranslationConfig.Header" xml:space="preserve">
<value>خدمة ترجمة LibreTranslate</value> <value>خدمة ترجمة LibreTranslate</value>
</data> </data>
<data name="SettingsPageTranslationInfoLink.Text" xml:space="preserve">
<value>قم بزيارة https://github.com/LibreTranslate/LibreTranslate للحصول على دروس التثبيت والمزيد من المعلومات (هذا البرنامج ليس له أي صلة بخدمة الترجمة هذه)</value>
</data>
<data name="SettingsPageUserWhoPurchased.Text" xml:space="preserve"> <data name="SettingsPageUserWhoPurchased.Text" xml:space="preserve">
<value>والمستخدمين الذين اشتروا ودعموا BetterLyrics</value> <value>والمستخدمين الذين اشتروا ودعموا BetterLyrics</value>
</data> </data>
@@ -1554,9 +1452,6 @@
<data name="SettingsPageWidth.Header" xml:space="preserve"> <data name="SettingsPageWidth.Header" xml:space="preserve">
<value>العرض</value> <value>العرض</value>
</data> </data>
<data name="SettingsPageWindowBounds.Header" xml:space="preserve">
<value>حدود النافذة</value>
</data>
<data name="SettingsPageWorkArea.Description" xml:space="preserve"> <data name="SettingsPageWorkArea.Description" xml:space="preserve">
<value>كمساحة عمل منفصلة، يتم تثبيتها في الحافة العلوية/السفلية للشاشة</value> <value>كمساحة عمل منفصلة، يتم تثبيتها في الحافة العلوية/السفلية للشاشة</value>
</data> </data>
@@ -1572,6 +1467,39 @@
<data name="StandardMode" xml:space="preserve"> <data name="StandardMode" xml:space="preserve">
<value>الوضع القياسي</value> <value>الوضع القياسي</value>
</data> </data>
<data name="StatsDashboardControlSources.Text" xml:space="preserve">
<value>المصادر</value>
</data>
<data name="StatsDashboardControlThisMonth.Header" xml:space="preserve">
<value>هذا الشهر</value>
</data>
<data name="StatsDashboardControlThisQuarter.Header" xml:space="preserve">
<value>هذا الربع</value>
</data>
<data name="StatsDashboardControlThisWeek.Header" xml:space="preserve">
<value>هذا الأسبوع</value>
</data>
<data name="StatsDashboardControlThisYear.Header" xml:space="preserve">
<value>هذا العام</value>
</data>
<data name="StatsDashboardControlToday.Header" xml:space="preserve">
<value>اليوم</value>
</data>
<data name="StatsDashboardControlTopArtists.Text" xml:space="preserve">
<value>كبار الفنانين</value>
</data>
<data name="StatsDashboardControlTopSongs.Text" xml:space="preserve">
<value>أعلى المسارات</value>
</data>
<data name="StatsDashboardControlTopSource.Text" xml:space="preserve">
<value>المصدر الأعلى</value>
</data>
<data name="StatsDashboardControlTotalDuration.Text" xml:space="preserve">
<value>المدة الإجمالية</value>
</data>
<data name="StatsDashboardControlTracksPlayed.Text" xml:space="preserve">
<value>المسارات التي تم تشغيلها</value>
</data>
<data name="SystemTrayExit.Text" xml:space="preserve"> <data name="SystemTrayExit.Text" xml:space="preserve">
<value>خروج</value> <value>خروج</value>
</data> </data>
@@ -1581,9 +1509,6 @@
<data name="SystemTrayMusicGallery.Text" xml:space="preserve"> <data name="SystemTrayMusicGallery.Text" xml:space="preserve">
<value>فتح مكتبة الموسيقى</value> <value>فتح مكتبة الموسيقى</value>
</data> </data>
<data name="SystemTrayPageTitle" xml:space="preserve">
<value>علبة النظام - BetterLyrics</value>
</data>
<data name="SystemTrayResetWindowPosition.Text" xml:space="preserve"> <data name="SystemTrayResetWindowPosition.Text" xml:space="preserve">
<value>إعادة تعيين موضع النافذة</value> <value>إعادة تعيين موضع النافذة</value>
</data> </data>

View File

@@ -129,21 +129,12 @@
<data name="AlbumArtSearchSMTCProvider" xml:space="preserve"> <data name="AlbumArtSearchSMTCProvider" xml:space="preserve">
<value>Musikplayer</value> <value>Musikplayer</value>
</data> </data>
<data name="AllLyricsSettingsControlPictureInPicture.Content" xml:space="preserve">
<value>Bild-im-Bild-Modus</value>
</data>
<data name="AppSettingsControlGeneral.Text" xml:space="preserve"> <data name="AppSettingsControlGeneral.Text" xml:space="preserve">
<value>Fenster</value> <value>Fenster</value>
</data> </data>
<data name="ArtistsSplitHint.Text" xml:space="preserve"> <data name="ArtistsSplitHint.Text" xml:space="preserve">
<value>Wenn Sie mehrere Künstler eingeben, trennen Sie diese bitte mit einem der folgenden Trennzeichen (nicht gemischt verwenden)</value> <value>Wenn Sie mehrere Künstler eingeben, trennen Sie diese bitte mit einem der folgenden Trennzeichen (nicht gemischt verwenden)</value>
</data> </data>
<data name="BaseWindowHostInfoBarCheckBox.Content" xml:space="preserve">
<value>Diese Nachricht nicht mehr anzeigen</value>
</data>
<data name="BaseWindowMiniFlyoutItem.Text" xml:space="preserve">
<value>Bild-im-Bild-Modus</value>
</data>
<data name="Cancel" xml:space="preserve"> <data name="Cancel" xml:space="preserve">
<value>Abbrechen</value> <value>Abbrechen</value>
</data> </data>
@@ -168,24 +159,45 @@
<data name="DockedMode" xml:space="preserve"> <data name="DockedMode" xml:space="preserve">
<value>Angedockter Modus</value> <value>Angedockter Modus</value>
</data> </data>
<data name="Error" xml:space="preserve">
<value>Fehler</value>
</data>
<data name="ExportSettingsSuccess" xml:space="preserve"> <data name="ExportSettingsSuccess" xml:space="preserve">
<value>Export erfolgreich</value> <value>Export erfolgreich</value>
</data> </data>
<data name="FailToStartLXMusicServer" xml:space="preserve"> <data name="FailToStartLXMusicServer" xml:space="preserve">
<value>Verbindung zum LX Music Server fehlgeschlagen. Bitte prüfen Sie unter Einstellungen - Wiedergabequelle - LX Music - LX Music Server, ob der Link korrekt ist</value> <value>Verbindung zum LX Music Server fehlgeschlagen. Bitte prüfen Sie unter Einstellungen - Wiedergabequelle - LX Music - LX Music Server, ob der Link korrekt ist</value>
</data> </data>
<data name="FileSystemServiceCleaningCache" xml:space="preserve">
<value>Cache wird gereinigt...</value>
</data>
<data name="FileSystemServiceConnectFailed" xml:space="preserve">
<value>Verbindung fehlgeschlagen</value>
</data>
<data name="FileSystemServiceConnecting" xml:space="preserve">
<value>Verbinde...</value>
</data>
<data name="FileSystemServiceFetchingFileList" xml:space="preserve">
<value>Lade Dateiliste...</value>
</data>
<data name="FileSystemServiceParsing" xml:space="preserve">
<value>Analysiere...</value>
</data>
<data name="FileSystemServicePrepareToClean" xml:space="preserve">
<value>Bereinigung des Caches vorbereiten...</value>
</data>
<data name="FileSystemServiceReady" xml:space="preserve">
<value>Bereit</value>
</data>
<data name="FileSystemServiceRootDirectoryWarning" xml:space="preserve">
<value>Der Pfad zum Stammverzeichnis wurde erkannt. Ein vollständiger Festplattenindex kann eine große Anzahl von Nicht-Mediendateien enthalten und dazu führen, dass die Suche zu lange dauert. Es wird empfohlen, ein bestimmtes Unterverzeichnis anzugeben.</value>
</data>
<data name="FileSystemServiceWaitingForScan" xml:space="preserve">
<value>Auf Scans warten...</value>
</data>
<data name="FullscreenMode" xml:space="preserve"> <data name="FullscreenMode" xml:space="preserve">
<value>Vollbildmodus</value> <value>Vollbildmodus</value>
</data> </data>
<data name="HostWindowClickThroughButton.Content" xml:space="preserve">
<value>Sperren</value>
</data>
<data name="HostWindowClickThroughFlyoutItem.Text" xml:space="preserve">
<value>Sperren</value>
</data>
<data name="HostWindowLockToolTip.Text" xml:space="preserve">
<value>Sperren</value>
</data>
<data name="HostWindowMusicGalleryButtonToolTip.Content" xml:space="preserve"> <data name="HostWindowMusicGalleryButtonToolTip.Content" xml:space="preserve">
<value>Musikgalerie</value> <value>Musikgalerie</value>
</data> </data>
@@ -204,9 +216,6 @@
<data name="Jyutping" xml:space="preserve"> <data name="Jyutping" xml:space="preserve">
<value>Jyutping (Kantonesisch)</value> <value>Jyutping (Kantonesisch)</value>
</data> </data>
<data name="KeepAtLeastOneStatusDefault" xml:space="preserve">
<value>Bitte stellen Sie sicher, dass mindestens ein Status als Standard festgelegt ist</value>
</data>
<data name="LastFMAuthFailed" xml:space="preserve"> <data name="LastFMAuthFailed" xml:space="preserve">
<value>Autorisierung fehlgeschlagen, bitte versuchen Sie es erneut</value> <value>Autorisierung fehlgeschlagen, bitte versuchen Sie es erneut</value>
</data> </data>
@@ -270,18 +279,12 @@
<data name="LyricsPageSettings.Text" xml:space="preserve"> <data name="LyricsPageSettings.Text" xml:space="preserve">
<value>Einstellungen</value> <value>Einstellungen</value>
</data> </data>
<data name="LyricsPageTimelineOffsetButtonToolTip.Content" xml:space="preserve">
<value>Songtext-Zeitversatz</value>
</data>
<data name="LyricsPageTranslationEnabled.Description" xml:space="preserve"> <data name="LyricsPageTranslationEnabled.Description" xml:space="preserve">
<value>Priorisiere Übersetzungen innerhalb des Songtextes; falls keine Übereinstimmung gefunden wird, fordere maschinelle Übersetzung vom LibreTranslate-Server an</value> <value>Priorisiere Übersetzungen innerhalb des Songtextes; falls keine Übereinstimmung gefunden wird, fordere maschinelle Übersetzung vom LibreTranslate-Server an</value>
</data> </data>
<data name="LyricsPageTranslationEnabled.Header" xml:space="preserve"> <data name="LyricsPageTranslationEnabled.Header" xml:space="preserve">
<value>Übersetzung aktivieren</value> <value>Übersetzung aktivieren</value>
</data> </data>
<data name="LyricsPageTranslationOnly.Header" xml:space="preserve">
<value>Nur Übersetzung anzeigen</value>
</data>
<data name="LyricsPageTranslationProviderPrefix.Header" xml:space="preserve"> <data name="LyricsPageTranslationProviderPrefix.Header" xml:space="preserve">
<value>Übersetzungsanbieter</value> <value>Übersetzungsanbieter</value>
</data> </data>
@@ -330,9 +333,6 @@
<data name="LyricsSearchControlSongInfoMapping.Text" xml:space="preserve"> <data name="LyricsSearchControlSongInfoMapping.Text" xml:space="preserve">
<value>Song-Info-Zuordnung</value> <value>Song-Info-Zuordnung</value>
</data> </data>
<data name="LyricsSearchControlTargetSearchProvider.Header" xml:space="preserve">
<value>Ziel-Suchanbieter für Songtexte</value>
</data>
<data name="LyricsSearchControlTitle.Header" xml:space="preserve"> <data name="LyricsSearchControlTitle.Header" xml:space="preserve">
<value>Titel</value> <value>Titel</value>
</data> </data>
@@ -351,15 +351,9 @@
<data name="LyricsSearchProviderTtmlFile" xml:space="preserve"> <data name="LyricsSearchProviderTtmlFile" xml:space="preserve">
<value>Lokale .TTML-Datei</value> <value>Lokale .TTML-Datei</value>
</data> </data>
<data name="LyricsWindowImmersiveButtonToolTip.Content" xml:space="preserve">
<value>Immersiver Modus</value>
</data>
<data name="LyricsWindowSettingsControlLyricsWindowConfig.Text" xml:space="preserve"> <data name="LyricsWindowSettingsControlLyricsWindowConfig.Text" xml:space="preserve">
<value>Konfiguration</value> <value>Konfiguration</value>
</data> </data>
<data name="LyricsWindowSettingsControlLyricsWindowMode.Header" xml:space="preserve">
<value>Songtext-Fenstermodus</value>
</data>
<data name="LyricsWindowSettingsControlSetDefault.Text" xml:space="preserve"> <data name="LyricsWindowSettingsControlSetDefault.Text" xml:space="preserve">
<value>Als Standard festlegen</value> <value>Als Standard festlegen</value>
</data> </data>
@@ -378,9 +372,6 @@
<data name="MainPageAlbumArtOnly.Content" xml:space="preserve"> <data name="MainPageAlbumArtOnly.Content" xml:space="preserve">
<value>Nur Albumcover-Bereich anzeigen</value> <value>Nur Albumcover-Bereich anzeigen</value>
</data> </data>
<data name="MainPageEnterImmersiveModeHint" xml:space="preserve">
<value>Erneut darüberfahren, um den Umschalt-Button anzuzeigen</value>
</data>
<data name="MainPageLyriscOnly.Content" xml:space="preserve"> <data name="MainPageLyriscOnly.Content" xml:space="preserve">
<value>Nur Songtext anzeigen</value> <value>Nur Songtext anzeigen</value>
</data> </data>
@@ -396,6 +387,18 @@
<data name="MainPageSplitView.Content" xml:space="preserve"> <data name="MainPageSplitView.Content" xml:space="preserve">
<value>Geteilte Ansicht</value> <value>Geteilte Ansicht</value>
</data> </data>
<data name="MediaSettingsControlLastSyncTime.Header" xml:space="preserve">
<value>Letzte Sync-Zeit</value>
</data>
<data name="MediaSettingsControlLocalFolder" xml:space="preserve">
<value>Lokaler Ordner</value>
</data>
<data name="MediaSettingsControlNameSetting.Header" xml:space="preserve">
<value>Name</value>
</data>
<data name="MediaSettingsControlSyncNow.Content" xml:space="preserve">
<value>Jetzt synchronisieren</value>
</data>
<data name="MusicGalleryPageAddToCustomList.Text" xml:space="preserve"> <data name="MusicGalleryPageAddToCustomList.Text" xml:space="preserve">
<value>Zur Wiedergabeliste hinzufügen</value> <value>Zur Wiedergabeliste hinzufügen</value>
</data> </data>
@@ -411,6 +414,12 @@
<data name="MusicGalleryPageAllSongs" xml:space="preserve"> <data name="MusicGalleryPageAllSongs" xml:space="preserve">
<value>Alle Musikstücke</value> <value>Alle Musikstücke</value>
</data> </data>
<data name="MusicGalleryPageDataSync.Message" xml:space="preserve">
<value>Synchronisierung der Medienbibliothek läuft...</value>
</data>
<data name="MusicGalleryPageDataSyncError.Message" xml:space="preserve">
<value>Es gibt ein Problem mit der Synchronisierung der Medienbibliothek</value>
</data>
<data name="MusicGalleryPageEmptyPlayingQueue.Text" xml:space="preserve"> <data name="MusicGalleryPageEmptyPlayingQueue.Text" xml:space="preserve">
<value>Warteschlange leeren</value> <value>Warteschlange leeren</value>
</data> </data>
@@ -420,9 +429,6 @@
<data name="MusicGalleryPageFileArtist.Header" xml:space="preserve"> <data name="MusicGalleryPageFileArtist.Header" xml:space="preserve">
<value>Künstler</value> <value>Künstler</value>
</data> </data>
<data name="MusicGalleryPageFileInfo.Text" xml:space="preserve">
<value>Datei-Info</value>
</data>
<data name="MusicGalleryPageFileInfoBitDepth.Header" xml:space="preserve"> <data name="MusicGalleryPageFileInfoBitDepth.Header" xml:space="preserve">
<value>Bittiefe</value> <value>Bittiefe</value>
</data> </data>
@@ -456,15 +462,15 @@
<data name="MusicGalleryPageFileNotFound.Text" xml:space="preserve"> <data name="MusicGalleryPageFileNotFound.Text" xml:space="preserve">
<value>Keine Songs in der Medienbibliothek gefunden</value> <value>Keine Songs in der Medienbibliothek gefunden</value>
</data> </data>
<data name="MusicGalleryPageFolder.Text" xml:space="preserve">
<value>Ordner</value>
</data>
<data name="MusicGalleryPageImportFromFile.Text" xml:space="preserve"> <data name="MusicGalleryPageImportFromFile.Text" xml:space="preserve">
<value>Aus Datei importieren</value> <value>Aus Datei importieren</value>
</data> </data>
<data name="MusicGalleryPageNewPlaylist.Text" xml:space="preserve"> <data name="MusicGalleryPageNewPlaylist.Text" xml:space="preserve">
<value>Wiedergabeliste erstellen</value> <value>Wiedergabeliste erstellen</value>
</data> </data>
<data name="MusicGalleryPagePlayAll.Content" xml:space="preserve">
<value>Alle abspielen</value>
</data>
<data name="MusicGalleryPagePlayingQueue.Text" xml:space="preserve"> <data name="MusicGalleryPagePlayingQueue.Text" xml:space="preserve">
<value>Wiedergabewarteschlange</value> <value>Wiedergabewarteschlange</value>
</data> </data>
@@ -472,7 +478,7 @@
<value>Wiedergabewarteschlange ist leer</value> <value>Wiedergabewarteschlange ist leer</value>
</data> </data>
<data name="MusicGalleryPagePlaylist.Text" xml:space="preserve"> <data name="MusicGalleryPagePlaylist.Text" xml:space="preserve">
<value>Wiedergabeliste</value> <value>Wiedergabelisten</value>
</data> </data>
<data name="MusicGalleryPageQueueLoop.Text" xml:space="preserve"> <data name="MusicGalleryPageQueueLoop.Text" xml:space="preserve">
<value>Liste wiederholen</value> <value>Liste wiederholen</value>
@@ -489,9 +495,6 @@
<data name="MusicGalleryPageScrollToPlayingItem.Text" xml:space="preserve"> <data name="MusicGalleryPageScrollToPlayingItem.Text" xml:space="preserve">
<value>Zum aktuellen Titel scrollen</value> <value>Zum aktuellen Titel scrollen</value>
</data> </data>
<data name="MusicGalleryPageSelectAll.Content" xml:space="preserve">
<value>Alle auswählen</value>
</data>
<data name="MusicGalleryPageSingleLoop.Text" xml:space="preserve"> <data name="MusicGalleryPageSingleLoop.Text" xml:space="preserve">
<value>Einzeltitel wiederholen</value> <value>Einzeltitel wiederholen</value>
</data> </data>
@@ -513,20 +516,29 @@
<data name="MusicGalleryPageSortType.Text" xml:space="preserve"> <data name="MusicGalleryPageSortType.Text" xml:space="preserve">
<value>Sortiertyp</value> <value>Sortiertyp</value>
</data> </data>
<data name="MusicGalleryPageStarredPlaylist.Content" xml:space="preserve">
<value>Favoriten-Wiedergabeliste</value>
</data>
<data name="MusicGalleryPageStopTrack.Text" xml:space="preserve"> <data name="MusicGalleryPageStopTrack.Text" xml:space="preserve">
<value>Stopp</value> <value>Stopp</value>
</data> </data>
<data name="MusicGalleryPageTitle" xml:space="preserve"> <data name="MusicGalleryPageTitle" xml:space="preserve">
<value>Musikgalerie - BetterLyrics</value> <value>Musikgalerie - BetterLyrics</value>
</data> </data>
<data name="MusicGalleryWindowDownButtonToolTip.Content" xml:space="preserve"> <data name="MusicSettingsControlAutoSyncInterval.Header" xml:space="preserve">
<value>Einklappen</value> <value>Auto-Sync-Frequenz</value>
</data> </data>
<data name="MusicGalleryWindowUpButtonToolTip.Content" xml:space="preserve"> <data name="MusicSettingsControlAutoSyncIntervalDisabled.Content" xml:space="preserve">
<value>Ausklappen</value> <value>Niemals</value>
</data>
<data name="MusicSettingsControlAutoSyncIntervalEveryDay.Content" xml:space="preserve">
<value>Täglich</value>
</data>
<data name="MusicSettingsControlAutoSyncIntervalEveryFifteenMin.Content" xml:space="preserve">
<value>Alle 15 Minuten</value>
</data>
<data name="MusicSettingsControlAutoSyncIntervalEveryHour.Content" xml:space="preserve">
<value>Stündlich</value>
</data>
<data name="MusicSettingsControlAutoSyncIntervalEverySixHrs.Content" xml:space="preserve">
<value>Alle 6 Stunden</value>
</data> </data>
<data name="NarrowMode" xml:space="preserve"> <data name="NarrowMode" xml:space="preserve">
<value>Schmaler Modus</value> <value>Schmaler Modus</value>
@@ -543,12 +555,27 @@
<data name="PrivacyPolicy.Content" xml:space="preserve"> <data name="PrivacyPolicy.Content" xml:space="preserve">
<value>Datenschutzrichtlinie</value> <value>Datenschutzrichtlinie</value>
</data> </data>
<data name="RemoteServerConfigControlBrowse.Content" xml:space="preserve">
<value>Durchsuchen Sie</value>
</data>
<data name="RemoteServerConfigControlName.Header" xml:space="preserve">
<value>Name</value>
</data>
<data name="RemoteServerConfigControlName.PlaceholderText" xml:space="preserve">
<value>Wenn Sie das Feld leer lassen, wird automatisch ein Standardname generiert.</value>
</data>
<data name="RemoteServerConfigControlPassword.Header" xml:space="preserve"> <data name="RemoteServerConfigControlPassword.Header" xml:space="preserve">
<value>Passwort</value> <value>Passwort</value>
</data> </data>
<data name="RemoteServerConfigControlPath.Header" xml:space="preserve"> <data name="RemoteServerConfigControlPath.Header" xml:space="preserve">
<value>Pfad</value> <value>Pfad</value>
</data> </data>
<data name="RemoteServerConfigControlPathNotExisted" xml:space="preserve">
<value>Der angegebene Ordnerpfad konnte nicht gefunden werden</value>
</data>
<data name="RemoteServerConfigControlPathRequired" xml:space="preserve">
<value>Pfad ist erforderlich</value>
</data>
<data name="RemoteServerConfigControlPort.Header" xml:space="preserve"> <data name="RemoteServerConfigControlPort.Header" xml:space="preserve">
<value>Port</value> <value>Port</value>
</data> </data>
@@ -576,9 +603,6 @@
<data name="SetingsPageFeedback.Text" xml:space="preserve"> <data name="SetingsPageFeedback.Text" xml:space="preserve">
<value>Feedback</value> <value>Feedback</value>
</data> </data>
<data name="SetingsPageInstructions.Text" xml:space="preserve">
<value>Anleitung</value>
</data>
<data name="SetingsPageSpecialThanks.Text" xml:space="preserve"> <data name="SetingsPageSpecialThanks.Text" xml:space="preserve">
<value>Besonderer Dank</value> <value>Besonderer Dank</value>
</data> </data>
@@ -606,9 +630,6 @@
<data name="SettingsPageAddFolderButton.Content" xml:space="preserve"> <data name="SettingsPageAddFolderButton.Content" xml:space="preserve">
<value>Hinzufügen</value> <value>Hinzufügen</value>
</data> </data>
<data name="SettingsPageAdvanced.Text" xml:space="preserve">
<value>Erweiterte Optionen</value>
</data>
<data name="SettingsPageAlbum.Header" xml:space="preserve"> <data name="SettingsPageAlbum.Header" xml:space="preserve">
<value>Album</value> <value>Album</value>
</data> </data>
@@ -624,15 +645,9 @@
<data name="SettingsPageAlbumArtSearchProvidersConfig.Text" xml:space="preserve"> <data name="SettingsPageAlbumArtSearchProvidersConfig.Text" xml:space="preserve">
<value>Albumcover-Quellen konfigurieren</value> <value>Albumcover-Quellen konfigurieren</value>
</data> </data>
<data name="SettingsPageAlbumArtSize.Header" xml:space="preserve">
<value>Albumcover-Größe</value>
</data>
<data name="SettingsPageAlbumEffect.Text" xml:space="preserve"> <data name="SettingsPageAlbumEffect.Text" xml:space="preserve">
<value>Albumcover-Effekt</value> <value>Albumcover-Effekt</value>
</data> </data>
<data name="SettingsPageAlbumLib.Content" xml:space="preserve">
<value>Albumcover-Quellen</value>
</data>
<data name="SettingsPageAlbumRadius.Header" xml:space="preserve"> <data name="SettingsPageAlbumRadius.Header" xml:space="preserve">
<value>Eckenradius</value> <value>Eckenradius</value>
</data> </data>
@@ -663,12 +678,6 @@
<data name="SettingsPageAppAppearance.Text" xml:space="preserve"> <data name="SettingsPageAppAppearance.Text" xml:space="preserve">
<value>Erscheinungsbild</value> <value>Erscheinungsbild</value>
</data> </data>
<data name="SettingsPageAppBehavior.Text" xml:space="preserve">
<value>Allgemeines Verhalten</value>
</data>
<data name="SettingsPageApply.Content" xml:space="preserve">
<value>Übernehmen</value>
</data>
<data name="SettingsPageArtist.Header" xml:space="preserve"> <data name="SettingsPageArtist.Header" xml:space="preserve">
<value>Künstler</value> <value>Künstler</value>
</data> </data>
@@ -687,23 +696,14 @@
<data name="SettingsPageAutoStart.Header" xml:space="preserve"> <data name="SettingsPageAutoStart.Header" xml:space="preserve">
<value>Autostart</value> <value>Autostart</value>
</data> </data>
<data name="SettingsPageAutoStartWindow.Header" xml:space="preserve">
<value>Beim Anwendungsstart</value>
</data>
<data name="SettingsPageBackdrop.Header" xml:space="preserve">
<value>Material für Songtext-Hintergrund</value>
</data>
<data name="SettingsPageBackgroundOverlay.Text" xml:space="preserve"> <data name="SettingsPageBackgroundOverlay.Text" xml:space="preserve">
<value>Songtext-Hintergrund</value> <value>Songtext-Hintergrund</value>
</data> </data>
<data name="SettingsPageBlurAmount.Header" xml:space="preserve"> <data name="SettingsPageBlurAmount.Header" xml:space="preserve">
<value>Unschärfe-Stärke</value> <value>Unschärfe-Stärke</value>
</data> </data>
<data name="SettingsPageBorderless.Header" xml:space="preserve">
<value>Rahmenloses Fenster</value>
</data>
<data name="SettingsPageCache.Description" xml:space="preserve"> <data name="SettingsPageCache.Description" xml:space="preserve">
<value>Einschließlich Protokolldateien, Online-Songtext-Cache</value> <value>Enthält Protokolldateien, Online-Liedtext-Cache</value>
</data> </data>
<data name="SettingsPageCache.Header" xml:space="preserve"> <data name="SettingsPageCache.Header" xml:space="preserve">
<value>Cache</value> <value>Cache</value>
@@ -738,9 +738,6 @@
<data name="SettingsPageCollapseDropdown.Content" xml:space="preserve"> <data name="SettingsPageCollapseDropdown.Content" xml:space="preserve">
<value>Dropdown einklappen</value> <value>Dropdown einklappen</value>
</data> </data>
<data name="SettingsPageCompactTitleBar.Content" xml:space="preserve">
<value>Kompakt</value>
</data>
<data name="SettingsPageConfigName.Description" xml:space="preserve"> <data name="SettingsPageConfigName.Description" xml:space="preserve">
<value>Das Benennen aufgezeichneter Fensterstatus hilft Ihnen, diese besser zu unterscheiden</value> <value>Das Benennen aufgezeichneter Fensterstatus hilft Ihnen, diese besser zu unterscheiden</value>
</data> </data>
@@ -759,18 +756,12 @@
<data name="SettingsPageCrossfade.Content" xml:space="preserve"> <data name="SettingsPageCrossfade.Content" xml:space="preserve">
<value>Überblenden</value> <value>Überblenden</value>
</data> </data>
<data name="SettingsPageCurrentLyricsWindowStatus.Text" xml:space="preserve">
<value>Aktueller Status des Songtext-Fensters</value>
</data>
<data name="SettingsPageCutletDockerServer.Header" xml:space="preserve"> <data name="SettingsPageCutletDockerServer.Header" xml:space="preserve">
<value>cutlet-docker Transliterationsdienst</value> <value>cutlet-docker Transliterationsdienst</value>
</data> </data>
<data name="SettingsPageDark.Content" xml:space="preserve"> <data name="SettingsPageDark.Content" xml:space="preserve">
<value>Dunkel</value> <value>Dunkel</value>
</data> </data>
<data name="SettingsPageDebugOverlay.Header" xml:space="preserve">
<value>Debug-Overlay anzeigen</value>
</data>
<data name="SettingsPageDelete.Text" xml:space="preserve"> <data name="SettingsPageDelete.Text" xml:space="preserve">
<value>Löschen</value> <value>Löschen</value>
</data> </data>
@@ -801,15 +792,9 @@
<data name="SettingsPageDockPlacementTop.Content" xml:space="preserve"> <data name="SettingsPageDockPlacementTop.Content" xml:space="preserve">
<value>Oben</value> <value>Oben</value>
</data> </data>
<data name="SettingsPageDockWindowHeight.Header" xml:space="preserve">
<value>Fensterhöhe</value>
</data>
<data name="SettingsPageDragArea.Header" xml:space="preserve"> <data name="SettingsPageDragArea.Header" xml:space="preserve">
<value>Ziehbereich</value> <value>Ziehbereich</value>
</data> </data>
<data name="SettingsPageEasingFuncType.Header" xml:space="preserve">
<value>Easing-Funktionstyp</value>
</data>
<data name="SettingsPageEasingTypeEaseInOutBack.Content" xml:space="preserve"> <data name="SettingsPageEasingTypeEaseInOutBack.Content" xml:space="preserve">
<value>Back Ease In-Out</value> <value>Back Ease In-Out</value>
</data> </data>
@@ -873,18 +858,15 @@
<data name="SettingsPageExitOnLyricsWindowClosed.Header" xml:space="preserve"> <data name="SettingsPageExitOnLyricsWindowClosed.Header" xml:space="preserve">
<value>App beenden, wenn Songtext-Fenster geschlossen wird</value> <value>App beenden, wenn Songtext-Fenster geschlossen wird</value>
</data> </data>
<data name="SettingsPageExportPlayHistoryButton.Content" xml:space="preserve">
<value>Spielverlauf exportieren</value>
</data>
<data name="SettingsPageExportSettingsButton.Content" xml:space="preserve"> <data name="SettingsPageExportSettingsButton.Content" xml:space="preserve">
<value>Einstellungen exportieren</value> <value>Einstellungen exportieren</value>
</data> </data>
<data name="SettingsPageExtendedTitleBar.Content" xml:space="preserve">
<value>Erweitert</value>
</data>
<data name="SettingsPageFan.Header" xml:space="preserve"> <data name="SettingsPageFan.Header" xml:space="preserve">
<value>Fächerförmiger Songtext</value> <value>Fächerförmiger Songtext</value>
</data> </data>
<data name="SettingsPageFAQ.Content" xml:space="preserve">
<value>Häufig gestellte Fragen (FAQ)</value>
</data>
<data name="SettingsPageFixedTimeStep.Header" xml:space="preserve"> <data name="SettingsPageFixedTimeStep.Header" xml:space="preserve">
<value>Rendering mit festem Zeitschritt</value> <value>Rendering mit festem Zeitschritt</value>
</data> </data>
@@ -921,9 +903,6 @@
<data name="SettingsPageHeight.Header" xml:space="preserve"> <data name="SettingsPageHeight.Header" xml:space="preserve">
<value>Höhe</value> <value>Höhe</value>
</data> </data>
<data name="SettingsPageHello.Text" xml:space="preserve">
<value>Hallo</value>
</data>
<data name="SettingsPageHelpUsTranslate.Content" xml:space="preserve"> <data name="SettingsPageHelpUsTranslate.Content" xml:space="preserve">
<value>Helfen Sie uns, diese App zu übersetzen</value> <value>Helfen Sie uns, diese App zu übersetzen</value>
</data> </data>
@@ -954,9 +933,6 @@
<data name="SettingsPageJapanese.Header" xml:space="preserve"> <data name="SettingsPageJapanese.Header" xml:space="preserve">
<value>Japanische Lautschrift</value> <value>Japanische Lautschrift</value>
</data> </data>
<data name="SettingsPageJoinNowButton.Content" xml:space="preserve">
<value>Jetzt beitreten</value>
</data>
<data name="SettingsPageJyutping.Content" xml:space="preserve"> <data name="SettingsPageJyutping.Content" xml:space="preserve">
<value>Jyutping (Kantonesisch)</value> <value>Jyutping (Kantonesisch)</value>
</data> </data>
@@ -1005,18 +981,12 @@
<data name="SettingsPageLight.Content" xml:space="preserve"> <data name="SettingsPageLight.Content" xml:space="preserve">
<value>Hell</value> <value>Hell</value>
</data> </data>
<data name="SettingsPageLinkedFile.Text" xml:space="preserve">
<value>Verknüpfte lokale Datei</value>
</data>
<data name="SettingsPageListenNewSession.Header" xml:space="preserve"> <data name="SettingsPageListenNewSession.Header" xml:space="preserve">
<value>Auf neue Wiedergabesitzungen hören</value> <value>Auf neue Wiedergabesitzungen hören</value>
</data> </data>
<data name="SettingsPageLocalFolder.Text" xml:space="preserve"> <data name="SettingsPageLocalFolder.Text" xml:space="preserve">
<value>Lokaler Ordner</value> <value>Lokaler Ordner</value>
</data> </data>
<data name="SettingsPageLog.Header" xml:space="preserve">
<value>Protokollierung</value>
</data>
<data name="SettingsPageLongSyllableDuration.Header" xml:space="preserve"> <data name="SettingsPageLongSyllableDuration.Header" xml:space="preserve">
<value>Schwellenwert für lange Silben</value> <value>Schwellenwert für lange Silben</value>
</data> </data>
@@ -1071,15 +1041,6 @@
<data name="SettingsPageLyricsFgFontColor.Header" xml:space="preserve"> <data name="SettingsPageLyricsFgFontColor.Header" xml:space="preserve">
<value>Aktuelle Zeile</value> <value>Aktuelle Zeile</value>
</data> </data>
<data name="SettingsPageLyricsFgFontColorAdaptiveColored.Content" xml:space="preserve">
<value>An Songtext-Hintergrund anpassen (Farbig)</value>
</data>
<data name="SettingsPageLyricsFgFontColorAdaptiveGrayed.Content" xml:space="preserve">
<value>An Songtext-Hintergrund anpassen (Grau)</value>
</data>
<data name="SettingsPageLyricsFgFontColorCustom.Content" xml:space="preserve">
<value>Benutzerdefiniert</value>
</data>
<data name="SettingsPageLyricsFloatAnimation.Header" xml:space="preserve"> <data name="SettingsPageLyricsFloatAnimation.Header" xml:space="preserve">
<value>Schwebe-Animation</value> <value>Schwebe-Animation</value>
</data> </data>
@@ -1107,27 +1068,12 @@
<data name="SettingsPageLyricsGlowEffect.Header" xml:space="preserve"> <data name="SettingsPageLyricsGlowEffect.Header" xml:space="preserve">
<value>Leuchteffekt</value> <value>Leuchteffekt</value>
</data> </data>
<data name="SettingsPageLyricsHighlight.Header" xml:space="preserve">
<value>Hervorhebung</value>
</data>
<data name="SettingsPageLyricsHighlightScope.Header" xml:space="preserve">
<value>Hervorhebungsbereich für Originaltext</value>
</data>
<data name="SettingsPageLyricsLeft.Content" xml:space="preserve">
<value>Links</value>
</data>
<data name="SettingsPageLyricsLight.Content" xml:space="preserve"> <data name="SettingsPageLyricsLight.Content" xml:space="preserve">
<value>Leicht</value> <value>Leicht</value>
</data> </data>
<data name="SettingsPageLyricsLineFade.Header" xml:space="preserve">
<value>Verblassen am Rand des Spielbereichs</value>
</data>
<data name="SettingsPageLyricsLineSpacingFactor.Header" xml:space="preserve"> <data name="SettingsPageLyricsLineSpacingFactor.Header" xml:space="preserve">
<value>Zeilenabstand</value> <value>Zeilenabstand</value>
</data> </data>
<data name="SettingsPageLyricsLineSpacingFactorUnit.Text" xml:space="preserve">
<value> x Zeilenhöhe</value>
</data>
<data name="SettingsPageLyricsMedium.Content" xml:space="preserve"> <data name="SettingsPageLyricsMedium.Content" xml:space="preserve">
<value>Mittel</value> <value>Mittel</value>
</data> </data>
@@ -1170,9 +1116,6 @@
<data name="SettingsPageLyricsSemiLight.Content" xml:space="preserve"> <data name="SettingsPageLyricsSemiLight.Content" xml:space="preserve">
<value>Halb-Leicht</value> <value>Halb-Leicht</value>
</data> </data>
<data name="SettingsPageLyricsShadow.Header" xml:space="preserve">
<value>Schatten</value>
</data>
<data name="SettingsPageLyricsStyle.Text" xml:space="preserve"> <data name="SettingsPageLyricsStyle.Text" xml:space="preserve">
<value>Songtext-Stil</value> <value>Songtext-Stil</value>
</data> </data>
@@ -1188,30 +1131,15 @@
<data name="SettingsPageLyricsTimelineThreshold.Header" xml:space="preserve"> <data name="SettingsPageLyricsTimelineThreshold.Header" xml:space="preserve">
<value>Schwellenwert für Songtext-Zeitachsensynchronisation</value> <value>Schwellenwert für Songtext-Zeitachsensynchronisation</value>
</data> </data>
<data name="SettingsPageLyricsTranslationHighlight.Header" xml:space="preserve">
<value>Übersetzungshervorhebung</value>
</data>
<data name="SettingsPageLyricsTranslationSeparator.Header" xml:space="preserve">
<value>Trennzeichen Original-Übersetzung</value>
</data>
<data name="SettingsPageLyricsVerticalEdgeOpacity.Header" xml:space="preserve">
<value>Deckkraft der vertikalen Kanten</value>
</data>
<data name="SettingsPageLyricsWindow.Text" xml:space="preserve"> <data name="SettingsPageLyricsWindow.Text" xml:space="preserve">
<value>Songtext-Fenster</value> <value>Songtext-Fenster</value>
</data> </data>
<data name="SettingsPageLyricsWindowManager.Text" xml:space="preserve">
<value>Songtext-Fenstermanager</value>
</data>
<data name="SettingsPageLyricsWindowMgr.Content" xml:space="preserve"> <data name="SettingsPageLyricsWindowMgr.Content" xml:space="preserve">
<value>Songtext-Fenstermanager</value> <value>Songtext-Fenstermanager</value>
</data> </data>
<data name="SettingsPageLyricsWindowSwitchHotKey.Header" xml:space="preserve"> <data name="SettingsPageLyricsWindowSwitchHotKey.Header" xml:space="preserve">
<value>Tastenkürzel für Songtext-Fensterstatuswechsel</value> <value>Tastenkürzel für Songtext-Fensterstatuswechsel</value>
</data> </data>
<data name="SettingsPageLyricsWindowToolTip.Content" xml:space="preserve">
<value>Songtext-Fenster</value>
</data>
<data name="SettingsPageMatchingThreshold.Description" xml:space="preserve"> <data name="SettingsPageMatchingThreshold.Description" xml:space="preserve">
<value>Das Anpassen dieses Wertes beeinflusst die sequenzielle Suche und die Suche nach der besten Übereinstimmung, hat jedoch keinen Einfluss auf die Suchergebnisse in der manuellen Songtext-Suchoberfläche</value> <value>Das Anpassen dieses Wertes beeinflusst die sequenzielle Suche und die Suche nach der besten Übereinstimmung, hat jedoch keinen Einfluss auf die Suchergebnisse in der manuellen Songtext-Suchoberfläche</value>
</data> </data>
@@ -1248,18 +1176,12 @@
<data name="SettingsPageMusicLib.Header" xml:space="preserve"> <data name="SettingsPageMusicLib.Header" xml:space="preserve">
<value>Lokale Medienbibliothek</value> <value>Lokale Medienbibliothek</value>
</data> </data>
<data name="SettingsPageMusicLibRealTimeWatch.Header" xml:space="preserve">
<value>Echtzeit-Dateiüberwachung</value>
</data>
<data name="SettingsPageNarrowMode.Text" xml:space="preserve"> <data name="SettingsPageNarrowMode.Text" xml:space="preserve">
<value>Schmaler Modus</value> <value>Schmaler Modus</value>
</data> </data>
<data name="SettingsPageNextSongHotKey.Header" xml:space="preserve"> <data name="SettingsPageNextSongHotKey.Header" xml:space="preserve">
<value>Tastenkürzel für nächsten Titel</value> <value>Tastenkürzel für nächsten Titel</value>
</data> </data>
<data name="SettingsPageNoBackdrop.Content" xml:space="preserve">
<value>Keiner</value>
</data>
<data name="SettingsPageOctTree.Content" xml:space="preserve"> <data name="SettingsPageOctTree.Content" xml:space="preserve">
<value>Aggressiv</value> <value>Aggressiv</value>
</data> </data>
@@ -1287,9 +1209,6 @@
<data name="SettingsPagePathIncludingOthersInfo" xml:space="preserve"> <data name="SettingsPagePathIncludingOthersInfo" xml:space="preserve">
<value>Dieser Ordner enthält bereits hinzugefügte Ordner, bitte entfernen Sie diese, um diesen Ordner hinzuzufügen</value> <value>Dieser Ordner enthält bereits hinzugefügte Ordner, bitte entfernen Sie diese, um diesen Ordner hinzuzufügen</value>
</data> </data>
<data name="SettingsPagePathNotFound.Text" xml:space="preserve">
<value>Dieser Pfad konnte auf Ihrem Computer nicht gefunden werden</value>
</data>
<data name="SettingsPagePatrons.Text" xml:space="preserve"> <data name="SettingsPagePatrons.Text" xml:space="preserve">
<value>Sponsoring</value> <value>Sponsoring</value>
</data> </data>
@@ -1335,15 +1254,9 @@
<data name="SettingsPageRealtimeStatus.Text" xml:space="preserve"> <data name="SettingsPageRealtimeStatus.Text" xml:space="preserve">
<value>Echtzeit-Status</value> <value>Echtzeit-Status</value>
</data> </data>
<data name="SettingsPageRecord.Content" xml:space="preserve">
<value>Aufzeichnen</value>
</data>
<data name="SettingsPageRecordedWindowStatus.Text" xml:space="preserve"> <data name="SettingsPageRecordedWindowStatus.Text" xml:space="preserve">
<value>Aufgezeichneter Fensterstatus</value> <value>Aufgezeichneter Fensterstatus</value>
</data> </data>
<data name="SettingsPageReference.Header" xml:space="preserve">
<value>Referenzen</value>
</data>
<data name="SettingsPageRefreshDropdown.Content" xml:space="preserve"> <data name="SettingsPageRefreshDropdown.Content" xml:space="preserve">
<value>Dropdown aktualisieren</value> <value>Dropdown aktualisieren</value>
</data> </data>
@@ -1362,9 +1275,6 @@
<data name="SettingsPageRight.Content" xml:space="preserve"> <data name="SettingsPageRight.Content" xml:space="preserve">
<value>Rechts</value> <value>Rechts</value>
</data> </data>
<data name="SettingsPageRomaji.Header" xml:space="preserve">
<value>Japanische Lautschrift</value>
</data>
<data name="SettingsPageScope.Header" xml:space="preserve"> <data name="SettingsPageScope.Header" xml:space="preserve">
<value>Bereich</value> <value>Bereich</value>
</data> </data>
@@ -1404,6 +1314,9 @@
<data name="SettingsPageSettingsManager.Header" xml:space="preserve"> <data name="SettingsPageSettingsManager.Header" xml:space="preserve">
<value>Einstellungsmanager</value> <value>Einstellungsmanager</value>
</data> </data>
<data name="SettingsPageSettingsPlayHistory.Header" xml:space="preserve">
<value>Geschichte spielen</value>
</data>
<data name="SettingsPageShareHub.Content" xml:space="preserve"> <data name="SettingsPageShareHub.Content" xml:space="preserve">
<value>Online Share Hub durchsuchen</value> <value>Online Share Hub durchsuchen</value>
</data> </data>
@@ -1431,18 +1344,12 @@
<data name="SettingsPageShowInSwitchers.Header" xml:space="preserve"> <data name="SettingsPageShowInSwitchers.Header" xml:space="preserve">
<value>In Systemumgebung anzeigen</value> <value>In Systemumgebung anzeigen</value>
</data> </data>
<data name="SettingsPageShowLayoutDragger.Header" xml:space="preserve">
<value>Layout-Splitter anzeigen</value>
</data>
<data name="SettingsPageShowTitle.Header" xml:space="preserve"> <data name="SettingsPageShowTitle.Header" xml:space="preserve">
<value>Titel anzeigen</value> <value>Titel anzeigen</value>
</data> </data>
<data name="SettingsPageSlide.Content" xml:space="preserve"> <data name="SettingsPageSlide.Content" xml:space="preserve">
<value>Gleiten</value> <value>Gleiten</value>
</data> </data>
<data name="SettingsPageSliderPrefix.Text" xml:space="preserve">
<value>Aktueller Wert: </value>
</data>
<data name="SettingsPageSnowFlakeLayer.Header" xml:space="preserve"> <data name="SettingsPageSnowFlakeLayer.Header" xml:space="preserve">
<value>Schneeflocken-Ebene</value> <value>Schneeflocken-Ebene</value>
</data> </data>
@@ -1485,6 +1392,9 @@
<data name="SettingsPageStartup.Text" xml:space="preserve"> <data name="SettingsPageStartup.Text" xml:space="preserve">
<value>Start</value> <value>Start</value>
</data> </data>
<data name="SettingsPageStats.Content" xml:space="preserve">
<value>Statistik</value>
</data>
<data name="SettingsPageStopTrackOnGalleryWindowClosed.Header" xml:space="preserve"> <data name="SettingsPageStopTrackOnGalleryWindowClosed.Header" xml:space="preserve">
<value>Wiedergabe stoppen, wenn Musikgalerie-Fenster geschlossen wird</value> <value>Wiedergabe stoppen, wenn Musikgalerie-Fenster geschlossen wird</value>
</data> </data>
@@ -1503,9 +1413,6 @@
<data name="SettingsPageTaskbarPlacement.Header" xml:space="preserve"> <data name="SettingsPageTaskbarPlacement.Header" xml:space="preserve">
<value>Taskleisten-Anheftposition</value> <value>Taskleisten-Anheftposition</value>
</data> </data>
<data name="SettingsPageThanksForPurchasing.Text" xml:space="preserve">
<value>Vielen Dank für den Kauf von BetterLyrics</value>
</data>
<data name="SettingsPageThanksList.Header" xml:space="preserve"> <data name="SettingsPageThanksList.Header" xml:space="preserve">
<value>Danksagung</value> <value>Danksagung</value>
</data> </data>
@@ -1524,12 +1431,6 @@
<data name="SettingsPageTitleBarAreaWhole.Content" xml:space="preserve"> <data name="SettingsPageTitleBarAreaWhole.Content" xml:space="preserve">
<value>Ganzes Fenster</value> <value>Ganzes Fenster</value>
</data> </data>
<data name="SettingsPageTitleBarType.Header" xml:space="preserve">
<value>Größe der Titelleiste</value>
</data>
<data name="SettingsPageToggleHotKey.Header" xml:space="preserve">
<value>Tastenkürzel zum Aktivieren/Deaktivieren</value>
</data>
<data name="SettingsPageTranslatedText.Header" xml:space="preserve"> <data name="SettingsPageTranslatedText.Header" xml:space="preserve">
<value>Übersetzung</value> <value>Übersetzung</value>
</data> </data>
@@ -1539,9 +1440,6 @@
<data name="SettingsPageTranslationConfig.Header" xml:space="preserve"> <data name="SettingsPageTranslationConfig.Header" xml:space="preserve">
<value>LibreTranslate-Dienst</value> <value>LibreTranslate-Dienst</value>
</data> </data>
<data name="SettingsPageTranslationInfoLink.Text" xml:space="preserve">
<value>Besuchen Sie https://github.com/LibreTranslate/LibreTranslate für eine Installationsanleitung und weitere Infos (Diese Software steht in keiner Verbindung zu diesem Dienst)</value>
</data>
<data name="SettingsPageUserWhoPurchased.Text" xml:space="preserve"> <data name="SettingsPageUserWhoPurchased.Text" xml:space="preserve">
<value>Und Benutzer, die BetterLyrics gekauft haben</value> <value>Und Benutzer, die BetterLyrics gekauft haben</value>
</data> </data>
@@ -1554,9 +1452,6 @@
<data name="SettingsPageWidth.Header" xml:space="preserve"> <data name="SettingsPageWidth.Header" xml:space="preserve">
<value>Breite</value> <value>Breite</value>
</data> </data>
<data name="SettingsPageWindowBounds.Header" xml:space="preserve">
<value>Fenstergrenzen</value>
</data>
<data name="SettingsPageWorkArea.Description" xml:space="preserve"> <data name="SettingsPageWorkArea.Description" xml:space="preserve">
<value>Als separater Arbeitsbereich, angedockt an die obere/untere Kante des Bildschirms</value> <value>Als separater Arbeitsbereich, angedockt an die obere/untere Kante des Bildschirms</value>
</data> </data>
@@ -1572,6 +1467,39 @@
<data name="StandardMode" xml:space="preserve"> <data name="StandardMode" xml:space="preserve">
<value>Standard-Modus</value> <value>Standard-Modus</value>
</data> </data>
<data name="StatsDashboardControlSources.Text" xml:space="preserve">
<value>Quellen</value>
</data>
<data name="StatsDashboardControlThisMonth.Header" xml:space="preserve">
<value>Dieser Monat</value>
</data>
<data name="StatsDashboardControlThisQuarter.Header" xml:space="preserve">
<value>Dieses Quartal</value>
</data>
<data name="StatsDashboardControlThisWeek.Header" xml:space="preserve">
<value>Diese Woche</value>
</data>
<data name="StatsDashboardControlThisYear.Header" xml:space="preserve">
<value>Dieses Jahr</value>
</data>
<data name="StatsDashboardControlToday.Header" xml:space="preserve">
<value>Heute</value>
</data>
<data name="StatsDashboardControlTopArtists.Text" xml:space="preserve">
<value>Top Künstler</value>
</data>
<data name="StatsDashboardControlTopSongs.Text" xml:space="preserve">
<value>Top Tracks</value>
</data>
<data name="StatsDashboardControlTopSource.Text" xml:space="preserve">
<value>Oberste Quelle</value>
</data>
<data name="StatsDashboardControlTotalDuration.Text" xml:space="preserve">
<value>Gesamtdauer</value>
</data>
<data name="StatsDashboardControlTracksPlayed.Text" xml:space="preserve">
<value>Gespielte Tracks</value>
</data>
<data name="SystemTrayExit.Text" xml:space="preserve"> <data name="SystemTrayExit.Text" xml:space="preserve">
<value>Beenden</value> <value>Beenden</value>
</data> </data>
@@ -1581,9 +1509,6 @@
<data name="SystemTrayMusicGallery.Text" xml:space="preserve"> <data name="SystemTrayMusicGallery.Text" xml:space="preserve">
<value>Musikgalerie öffnen</value> <value>Musikgalerie öffnen</value>
</data> </data>
<data name="SystemTrayPageTitle" xml:space="preserve">
<value>System-Tray - BetterLyrics</value>
</data>
<data name="SystemTrayResetWindowPosition.Text" xml:space="preserve"> <data name="SystemTrayResetWindowPosition.Text" xml:space="preserve">
<value>Fensterposition zurücksetzen</value> <value>Fensterposition zurücksetzen</value>
</data> </data>

View File

@@ -129,21 +129,12 @@
<data name="AlbumArtSearchSMTCProvider" xml:space="preserve"> <data name="AlbumArtSearchSMTCProvider" xml:space="preserve">
<value>Music player</value> <value>Music player</value>
</data> </data>
<data name="AllLyricsSettingsControlPictureInPicture.Content" xml:space="preserve">
<value>Picture-in-Picture mode</value>
</data>
<data name="AppSettingsControlGeneral.Text" xml:space="preserve"> <data name="AppSettingsControlGeneral.Text" xml:space="preserve">
<value>Window</value> <value>Window</value>
</data> </data>
<data name="ArtistsSplitHint.Text" xml:space="preserve"> <data name="ArtistsSplitHint.Text" xml:space="preserve">
<value>When entering multiple artists, please separate them using one of the following delimiters (do not mix use)</value> <value>When entering multiple artists, please separate them using one of the following delimiters (do not mix use)</value>
</data> </data>
<data name="BaseWindowHostInfoBarCheckBox.Content" xml:space="preserve">
<value>Do not show this message again</value>
</data>
<data name="BaseWindowMiniFlyoutItem.Text" xml:space="preserve">
<value>Picture-in-Picture mode</value>
</data>
<data name="Cancel" xml:space="preserve"> <data name="Cancel" xml:space="preserve">
<value>Cancel</value> <value>Cancel</value>
</data> </data>
@@ -168,24 +159,45 @@
<data name="DockedMode" xml:space="preserve"> <data name="DockedMode" xml:space="preserve">
<value>Docked Mode</value> <value>Docked Mode</value>
</data> </data>
<data name="Error" xml:space="preserve">
<value>Error</value>
</data>
<data name="ExportSettingsSuccess" xml:space="preserve"> <data name="ExportSettingsSuccess" xml:space="preserve">
<value>Export successful</value> <value>Export successful</value>
</data> </data>
<data name="FailToStartLXMusicServer" xml:space="preserve"> <data name="FailToStartLXMusicServer" xml:space="preserve">
<value>Unable to connect to LX Music Server. Please go to Settings - Playback Source - LX Music - LX Music Server to check if the link is entered correctly</value> <value>Unable to connect to LX Music Server. Please go to Settings - Playback Source - LX Music - LX Music Server to check if the link is entered correctly</value>
</data> </data>
<data name="FileSystemServiceCleaningCache" xml:space="preserve">
<value>Clearing cache...</value>
</data>
<data name="FileSystemServiceConnectFailed" xml:space="preserve">
<value>Connection failed</value>
</data>
<data name="FileSystemServiceConnecting" xml:space="preserve">
<value>Connecting...</value>
</data>
<data name="FileSystemServiceFetchingFileList" xml:space="preserve">
<value>Fetching file list...</value>
</data>
<data name="FileSystemServiceParsing" xml:space="preserve">
<value>Parsing...</value>
</data>
<data name="FileSystemServicePrepareToClean" xml:space="preserve">
<value>Preparing to clear cache...</value>
</data>
<data name="FileSystemServiceReady" xml:space="preserve">
<value>Ready</value>
</data>
<data name="FileSystemServiceRootDirectoryWarning" xml:space="preserve">
<value>The root directory path has been detected. A full disk index may contain a large number of non-media files and cause the scan to take too long. It is recommended to specify a specific subdirectory.</value>
</data>
<data name="FileSystemServiceWaitingForScan" xml:space="preserve">
<value>Preparing to scan...</value>
</data>
<data name="FullscreenMode" xml:space="preserve"> <data name="FullscreenMode" xml:space="preserve">
<value>Fullscreen Mode</value> <value>Fullscreen Mode</value>
</data> </data>
<data name="HostWindowClickThroughButton.Content" xml:space="preserve">
<value>Lock</value>
</data>
<data name="HostWindowClickThroughFlyoutItem.Text" xml:space="preserve">
<value>Lock</value>
</data>
<data name="HostWindowLockToolTip.Text" xml:space="preserve">
<value>Lock</value>
</data>
<data name="HostWindowMusicGalleryButtonToolTip.Content" xml:space="preserve"> <data name="HostWindowMusicGalleryButtonToolTip.Content" xml:space="preserve">
<value>Music Gallery</value> <value>Music Gallery</value>
</data> </data>
@@ -204,9 +216,6 @@
<data name="Jyutping" xml:space="preserve"> <data name="Jyutping" xml:space="preserve">
<value>Jyutping (Cantonese)</value> <value>Jyutping (Cantonese)</value>
</data> </data>
<data name="KeepAtLeastOneStatusDefault" xml:space="preserve">
<value>Please ensure at least one status is set as default</value>
</data>
<data name="LastFMAuthFailed" xml:space="preserve"> <data name="LastFMAuthFailed" xml:space="preserve">
<value>Authorization failed, please try again</value> <value>Authorization failed, please try again</value>
</data> </data>
@@ -270,18 +279,12 @@
<data name="LyricsPageSettings.Text" xml:space="preserve"> <data name="LyricsPageSettings.Text" xml:space="preserve">
<value>Settings</value> <value>Settings</value>
</data> </data>
<data name="LyricsPageTimelineOffsetButtonToolTip.Content" xml:space="preserve">
<value>Lyrics Timeline Offset</value>
</data>
<data name="LyricsPageTranslationEnabled.Description" xml:space="preserve"> <data name="LyricsPageTranslationEnabled.Description" xml:space="preserve">
<value>Prioritize reading translations within lyrics; if no match, request machine translation from LibreTranslate server</value> <value>Prioritize reading translations within lyrics; if no match, request machine translation from LibreTranslate server</value>
</data> </data>
<data name="LyricsPageTranslationEnabled.Header" xml:space="preserve"> <data name="LyricsPageTranslationEnabled.Header" xml:space="preserve">
<value>Enable Translation</value> <value>Enable Translation</value>
</data> </data>
<data name="LyricsPageTranslationOnly.Header" xml:space="preserve">
<value>Show Translation Only</value>
</data>
<data name="LyricsPageTranslationProviderPrefix.Header" xml:space="preserve"> <data name="LyricsPageTranslationProviderPrefix.Header" xml:space="preserve">
<value>Translation Provider</value> <value>Translation Provider</value>
</data> </data>
@@ -330,9 +333,6 @@
<data name="LyricsSearchControlSongInfoMapping.Text" xml:space="preserve"> <data name="LyricsSearchControlSongInfoMapping.Text" xml:space="preserve">
<value>Song Info Mapping</value> <value>Song Info Mapping</value>
</data> </data>
<data name="LyricsSearchControlTargetSearchProvider.Header" xml:space="preserve">
<value>Target Lyrics Search Provider</value>
</data>
<data name="LyricsSearchControlTitle.Header" xml:space="preserve"> <data name="LyricsSearchControlTitle.Header" xml:space="preserve">
<value>Title</value> <value>Title</value>
</data> </data>
@@ -351,15 +351,9 @@
<data name="LyricsSearchProviderTtmlFile" xml:space="preserve"> <data name="LyricsSearchProviderTtmlFile" xml:space="preserve">
<value>Local .TTML File</value> <value>Local .TTML File</value>
</data> </data>
<data name="LyricsWindowImmersiveButtonToolTip.Content" xml:space="preserve">
<value>Immersive Mode</value>
</data>
<data name="LyricsWindowSettingsControlLyricsWindowConfig.Text" xml:space="preserve"> <data name="LyricsWindowSettingsControlLyricsWindowConfig.Text" xml:space="preserve">
<value>Configuration</value> <value>Configuration</value>
</data> </data>
<data name="LyricsWindowSettingsControlLyricsWindowMode.Header" xml:space="preserve">
<value>Lyrics Window Mode</value>
</data>
<data name="LyricsWindowSettingsControlSetDefault.Text" xml:space="preserve"> <data name="LyricsWindowSettingsControlSetDefault.Text" xml:space="preserve">
<value>Set as Default</value> <value>Set as Default</value>
</data> </data>
@@ -378,9 +372,6 @@
<data name="MainPageAlbumArtOnly.Content" xml:space="preserve"> <data name="MainPageAlbumArtOnly.Content" xml:space="preserve">
<value>Show album art area only</value> <value>Show album art area only</value>
</data> </data>
<data name="MainPageEnterImmersiveModeHint" xml:space="preserve">
<value>Hover again to show the toggle button</value>
</data>
<data name="MainPageLyriscOnly.Content" xml:space="preserve"> <data name="MainPageLyriscOnly.Content" xml:space="preserve">
<value>Show lyrics only</value> <value>Show lyrics only</value>
</data> </data>
@@ -396,6 +387,18 @@
<data name="MainPageSplitView.Content" xml:space="preserve"> <data name="MainPageSplitView.Content" xml:space="preserve">
<value>Split View</value> <value>Split View</value>
</data> </data>
<data name="MediaSettingsControlLastSyncTime.Header" xml:space="preserve">
<value>Last Sync Time</value>
</data>
<data name="MediaSettingsControlLocalFolder" xml:space="preserve">
<value>Local Folder</value>
</data>
<data name="MediaSettingsControlNameSetting.Header" xml:space="preserve">
<value>Name</value>
</data>
<data name="MediaSettingsControlSyncNow.Content" xml:space="preserve">
<value>Sync now</value>
</data>
<data name="MusicGalleryPageAddToCustomList.Text" xml:space="preserve"> <data name="MusicGalleryPageAddToCustomList.Text" xml:space="preserve">
<value>Add to playlist</value> <value>Add to playlist</value>
</data> </data>
@@ -406,11 +409,17 @@
<value>Next item</value> <value>Next item</value>
</data> </data>
<data name="MusicGalleryPageAddToPlayingQueue.Text" xml:space="preserve"> <data name="MusicGalleryPageAddToPlayingQueue.Text" xml:space="preserve">
<value>Add to queue</value> <value>Add to playing queue</value>
</data> </data>
<data name="MusicGalleryPageAllSongs" xml:space="preserve"> <data name="MusicGalleryPageAllSongs" xml:space="preserve">
<value>All Music</value> <value>All Music</value>
</data> </data>
<data name="MusicGalleryPageDataSync.Message" xml:space="preserve">
<value>Media Library sync in progress...</value>
</data>
<data name="MusicGalleryPageDataSyncError.Message" xml:space="preserve">
<value>There is a problem with Media Library sync</value>
</data>
<data name="MusicGalleryPageEmptyPlayingQueue.Text" xml:space="preserve"> <data name="MusicGalleryPageEmptyPlayingQueue.Text" xml:space="preserve">
<value>Clear queue</value> <value>Clear queue</value>
</data> </data>
@@ -420,9 +429,6 @@
<data name="MusicGalleryPageFileArtist.Header" xml:space="preserve"> <data name="MusicGalleryPageFileArtist.Header" xml:space="preserve">
<value>Artist</value> <value>Artist</value>
</data> </data>
<data name="MusicGalleryPageFileInfo.Text" xml:space="preserve">
<value>File Info</value>
</data>
<data name="MusicGalleryPageFileInfoBitDepth.Header" xml:space="preserve"> <data name="MusicGalleryPageFileInfoBitDepth.Header" xml:space="preserve">
<value>Bit Depth</value> <value>Bit Depth</value>
</data> </data>
@@ -456,14 +462,14 @@
<data name="MusicGalleryPageFileNotFound.Text" xml:space="preserve"> <data name="MusicGalleryPageFileNotFound.Text" xml:space="preserve">
<value>No songs found in media library</value> <value>No songs found in media library</value>
</data> </data>
<data name="MusicGalleryPageFolder.Text" xml:space="preserve">
<value>Folders</value>
</data>
<data name="MusicGalleryPageImportFromFile.Text" xml:space="preserve"> <data name="MusicGalleryPageImportFromFile.Text" xml:space="preserve">
<value>Import from file</value> <value>Import from file</value>
</data> </data>
<data name="MusicGalleryPageNewPlaylist.Text" xml:space="preserve"> <data name="MusicGalleryPageNewPlaylist.Text" xml:space="preserve">
<value>Create Playlist</value> <value>Create playlist</value>
</data>
<data name="MusicGalleryPagePlayAll.Content" xml:space="preserve">
<value>Play all</value>
</data> </data>
<data name="MusicGalleryPagePlayingQueue.Text" xml:space="preserve"> <data name="MusicGalleryPagePlayingQueue.Text" xml:space="preserve">
<value>Playing Queue</value> <value>Playing Queue</value>
@@ -472,7 +478,7 @@
<value>Playing queue is empty</value> <value>Playing queue is empty</value>
</data> </data>
<data name="MusicGalleryPagePlaylist.Text" xml:space="preserve"> <data name="MusicGalleryPagePlaylist.Text" xml:space="preserve">
<value>Playlist</value> <value>Playlists</value>
</data> </data>
<data name="MusicGalleryPageQueueLoop.Text" xml:space="preserve"> <data name="MusicGalleryPageQueueLoop.Text" xml:space="preserve">
<value>Loop List</value> <value>Loop List</value>
@@ -489,9 +495,6 @@
<data name="MusicGalleryPageScrollToPlayingItem.Text" xml:space="preserve"> <data name="MusicGalleryPageScrollToPlayingItem.Text" xml:space="preserve">
<value>Scroll to playing item</value> <value>Scroll to playing item</value>
</data> </data>
<data name="MusicGalleryPageSelectAll.Content" xml:space="preserve">
<value>Select all</value>
</data>
<data name="MusicGalleryPageSingleLoop.Text" xml:space="preserve"> <data name="MusicGalleryPageSingleLoop.Text" xml:space="preserve">
<value>Loop Single</value> <value>Loop Single</value>
</data> </data>
@@ -513,20 +516,29 @@
<data name="MusicGalleryPageSortType.Text" xml:space="preserve"> <data name="MusicGalleryPageSortType.Text" xml:space="preserve">
<value>Sort Type</value> <value>Sort Type</value>
</data> </data>
<data name="MusicGalleryPageStarredPlaylist.Content" xml:space="preserve">
<value>Starred Playlist</value>
</data>
<data name="MusicGalleryPageStopTrack.Text" xml:space="preserve"> <data name="MusicGalleryPageStopTrack.Text" xml:space="preserve">
<value>Stop</value> <value>Stop</value>
</data> </data>
<data name="MusicGalleryPageTitle" xml:space="preserve"> <data name="MusicGalleryPageTitle" xml:space="preserve">
<value>Music Gallery - BetterLyrics</value> <value>Music Gallery - BetterLyrics</value>
</data> </data>
<data name="MusicGalleryWindowDownButtonToolTip.Content" xml:space="preserve"> <data name="MusicSettingsControlAutoSyncInterval.Header" xml:space="preserve">
<value>Collapse</value> <value>Auto-sync Frequency</value>
</data> </data>
<data name="MusicGalleryWindowUpButtonToolTip.Content" xml:space="preserve"> <data name="MusicSettingsControlAutoSyncIntervalDisabled.Content" xml:space="preserve">
<value>Expand</value> <value>Never</value>
</data>
<data name="MusicSettingsControlAutoSyncIntervalEveryDay.Content" xml:space="preserve">
<value>Every Day</value>
</data>
<data name="MusicSettingsControlAutoSyncIntervalEveryFifteenMin.Content" xml:space="preserve">
<value>Every 15 Minutes</value>
</data>
<data name="MusicSettingsControlAutoSyncIntervalEveryHour.Content" xml:space="preserve">
<value>Every Hour</value>
</data>
<data name="MusicSettingsControlAutoSyncIntervalEverySixHrs.Content" xml:space="preserve">
<value>Every 6 Hours</value>
</data> </data>
<data name="NarrowMode" xml:space="preserve"> <data name="NarrowMode" xml:space="preserve">
<value>Narrow Mode</value> <value>Narrow Mode</value>
@@ -543,12 +555,27 @@
<data name="PrivacyPolicy.Content" xml:space="preserve"> <data name="PrivacyPolicy.Content" xml:space="preserve">
<value>Privacy Policy</value> <value>Privacy Policy</value>
</data> </data>
<data name="RemoteServerConfigControlBrowse.Content" xml:space="preserve">
<value>Browse</value>
</data>
<data name="RemoteServerConfigControlName.Header" xml:space="preserve">
<value>Name</value>
</data>
<data name="RemoteServerConfigControlName.PlaceholderText" xml:space="preserve">
<value>Leaving it blank will automatically generate a default name.</value>
</data>
<data name="RemoteServerConfigControlPassword.Header" xml:space="preserve"> <data name="RemoteServerConfigControlPassword.Header" xml:space="preserve">
<value>Password</value> <value>Password</value>
</data> </data>
<data name="RemoteServerConfigControlPath.Header" xml:space="preserve"> <data name="RemoteServerConfigControlPath.Header" xml:space="preserve">
<value>Path</value> <value>Path</value>
</data> </data>
<data name="RemoteServerConfigControlPathNotExisted" xml:space="preserve">
<value>The specified folder path could not be found</value>
</data>
<data name="RemoteServerConfigControlPathRequired" xml:space="preserve">
<value>Path is required</value>
</data>
<data name="RemoteServerConfigControlPort.Header" xml:space="preserve"> <data name="RemoteServerConfigControlPort.Header" xml:space="preserve">
<value>Port</value> <value>Port</value>
</data> </data>
@@ -576,9 +603,6 @@
<data name="SetingsPageFeedback.Text" xml:space="preserve"> <data name="SetingsPageFeedback.Text" xml:space="preserve">
<value>Feedback</value> <value>Feedback</value>
</data> </data>
<data name="SetingsPageInstructions.Text" xml:space="preserve">
<value>Instructions</value>
</data>
<data name="SetingsPageSpecialThanks.Text" xml:space="preserve"> <data name="SetingsPageSpecialThanks.Text" xml:space="preserve">
<value>Special Thanks</value> <value>Special Thanks</value>
</data> </data>
@@ -606,9 +630,6 @@
<data name="SettingsPageAddFolderButton.Content" xml:space="preserve"> <data name="SettingsPageAddFolderButton.Content" xml:space="preserve">
<value>Add</value> <value>Add</value>
</data> </data>
<data name="SettingsPageAdvanced.Text" xml:space="preserve">
<value>Advanced Options</value>
</data>
<data name="SettingsPageAlbum.Header" xml:space="preserve"> <data name="SettingsPageAlbum.Header" xml:space="preserve">
<value>Album</value> <value>Album</value>
</data> </data>
@@ -624,15 +645,9 @@
<data name="SettingsPageAlbumArtSearchProvidersConfig.Text" xml:space="preserve"> <data name="SettingsPageAlbumArtSearchProvidersConfig.Text" xml:space="preserve">
<value>Configure Album Art Sources</value> <value>Configure Album Art Sources</value>
</data> </data>
<data name="SettingsPageAlbumArtSize.Header" xml:space="preserve">
<value>Album Art Size</value>
</data>
<data name="SettingsPageAlbumEffect.Text" xml:space="preserve"> <data name="SettingsPageAlbumEffect.Text" xml:space="preserve">
<value>Album Art Effect</value> <value>Album Art Effect</value>
</data> </data>
<data name="SettingsPageAlbumLib.Content" xml:space="preserve">
<value>Album Art Sources</value>
</data>
<data name="SettingsPageAlbumRadius.Header" xml:space="preserve"> <data name="SettingsPageAlbumRadius.Header" xml:space="preserve">
<value>Corner Radius</value> <value>Corner Radius</value>
</data> </data>
@@ -663,12 +678,6 @@
<data name="SettingsPageAppAppearance.Text" xml:space="preserve"> <data name="SettingsPageAppAppearance.Text" xml:space="preserve">
<value>App Appearance</value> <value>App Appearance</value>
</data> </data>
<data name="SettingsPageAppBehavior.Text" xml:space="preserve">
<value>General Behavior</value>
</data>
<data name="SettingsPageApply.Content" xml:space="preserve">
<value>Apply</value>
</data>
<data name="SettingsPageArtist.Header" xml:space="preserve"> <data name="SettingsPageArtist.Header" xml:space="preserve">
<value>Artist</value> <value>Artist</value>
</data> </data>
@@ -687,21 +696,12 @@
<data name="SettingsPageAutoStart.Header" xml:space="preserve"> <data name="SettingsPageAutoStart.Header" xml:space="preserve">
<value>Auto Start</value> <value>Auto Start</value>
</data> </data>
<data name="SettingsPageAutoStartWindow.Header" xml:space="preserve">
<value>On application startup</value>
</data>
<data name="SettingsPageBackdrop.Header" xml:space="preserve">
<value>Lyrics Background Material</value>
</data>
<data name="SettingsPageBackgroundOverlay.Text" xml:space="preserve"> <data name="SettingsPageBackgroundOverlay.Text" xml:space="preserve">
<value>Lyrics Background</value> <value>Lyrics Background</value>
</data> </data>
<data name="SettingsPageBlurAmount.Header" xml:space="preserve"> <data name="SettingsPageBlurAmount.Header" xml:space="preserve">
<value>Blur Amount</value> <value>Blur Amount</value>
</data> </data>
<data name="SettingsPageBorderless.Header" xml:space="preserve">
<value>Borderless Window</value>
</data>
<data name="SettingsPageCache.Description" xml:space="preserve"> <data name="SettingsPageCache.Description" xml:space="preserve">
<value>Includes log files, online lyrics cache</value> <value>Includes log files, online lyrics cache</value>
</data> </data>
@@ -733,14 +733,11 @@
<value>Clear Cache Files</value> <value>Clear Cache Files</value>
</data> </data>
<data name="SettingsPageCloseStatus.Text" xml:space="preserve"> <data name="SettingsPageCloseStatus.Text" xml:space="preserve">
<value>Closed</value> <value>Close</value>
</data> </data>
<data name="SettingsPageCollapseDropdown.Content" xml:space="preserve"> <data name="SettingsPageCollapseDropdown.Content" xml:space="preserve">
<value>Collapse Dropdown</value> <value>Collapse Dropdown</value>
</data> </data>
<data name="SettingsPageCompactTitleBar.Content" xml:space="preserve">
<value>Compact</value>
</data>
<data name="SettingsPageConfigName.Description" xml:space="preserve"> <data name="SettingsPageConfigName.Description" xml:space="preserve">
<value>Naming recorded window statuses helps you distinguish them better</value> <value>Naming recorded window statuses helps you distinguish them better</value>
</data> </data>
@@ -759,18 +756,12 @@
<data name="SettingsPageCrossfade.Content" xml:space="preserve"> <data name="SettingsPageCrossfade.Content" xml:space="preserve">
<value>Crossfade</value> <value>Crossfade</value>
</data> </data>
<data name="SettingsPageCurrentLyricsWindowStatus.Text" xml:space="preserve">
<value>Current Lyrics Window Status</value>
</data>
<data name="SettingsPageCutletDockerServer.Header" xml:space="preserve"> <data name="SettingsPageCutletDockerServer.Header" xml:space="preserve">
<value>cutlet-docker Transliteration Service</value> <value>cutlet-docker Transliteration Service</value>
</data> </data>
<data name="SettingsPageDark.Content" xml:space="preserve"> <data name="SettingsPageDark.Content" xml:space="preserve">
<value>Dark</value> <value>Dark</value>
</data> </data>
<data name="SettingsPageDebugOverlay.Header" xml:space="preserve">
<value>Show debug overlay</value>
</data>
<data name="SettingsPageDelete.Text" xml:space="preserve"> <data name="SettingsPageDelete.Text" xml:space="preserve">
<value>Delete</value> <value>Delete</value>
</data> </data>
@@ -801,15 +792,9 @@
<data name="SettingsPageDockPlacementTop.Content" xml:space="preserve"> <data name="SettingsPageDockPlacementTop.Content" xml:space="preserve">
<value>Top</value> <value>Top</value>
</data> </data>
<data name="SettingsPageDockWindowHeight.Header" xml:space="preserve">
<value>Window Height</value>
</data>
<data name="SettingsPageDragArea.Header" xml:space="preserve"> <data name="SettingsPageDragArea.Header" xml:space="preserve">
<value>Draggable Area</value> <value>Draggable Area</value>
</data> </data>
<data name="SettingsPageEasingFuncType.Header" xml:space="preserve">
<value>Easing Function Type</value>
</data>
<data name="SettingsPageEasingTypeEaseInOutBack.Content" xml:space="preserve"> <data name="SettingsPageEasingTypeEaseInOutBack.Content" xml:space="preserve">
<value>Back Ease In-Out</value> <value>Back Ease In-Out</value>
</data> </data>
@@ -873,18 +858,15 @@
<data name="SettingsPageExitOnLyricsWindowClosed.Header" xml:space="preserve"> <data name="SettingsPageExitOnLyricsWindowClosed.Header" xml:space="preserve">
<value>Exit app when lyrics window is closed</value> <value>Exit app when lyrics window is closed</value>
</data> </data>
<data name="SettingsPageExportPlayHistoryButton.Content" xml:space="preserve">
<value>Export play history</value>
</data>
<data name="SettingsPageExportSettingsButton.Content" xml:space="preserve"> <data name="SettingsPageExportSettingsButton.Content" xml:space="preserve">
<value>Export Settings</value> <value>Export Settings</value>
</data> </data>
<data name="SettingsPageExtendedTitleBar.Content" xml:space="preserve">
<value>Extended</value>
</data>
<data name="SettingsPageFan.Header" xml:space="preserve"> <data name="SettingsPageFan.Header" xml:space="preserve">
<value>Fan-shaped Lyrics</value> <value>Fan-shaped Lyrics</value>
</data> </data>
<data name="SettingsPageFAQ.Content" xml:space="preserve">
<value>FAQ</value>
</data>
<data name="SettingsPageFixedTimeStep.Header" xml:space="preserve"> <data name="SettingsPageFixedTimeStep.Header" xml:space="preserve">
<value>Fixed Time Step Rendering</value> <value>Fixed Time Step Rendering</value>
</data> </data>
@@ -921,9 +903,6 @@
<data name="SettingsPageHeight.Header" xml:space="preserve"> <data name="SettingsPageHeight.Header" xml:space="preserve">
<value>Height</value> <value>Height</value>
</data> </data>
<data name="SettingsPageHello.Text" xml:space="preserve">
<value>Hello</value>
</data>
<data name="SettingsPageHelpUsTranslate.Content" xml:space="preserve"> <data name="SettingsPageHelpUsTranslate.Content" xml:space="preserve">
<value>Help us translate this app</value> <value>Help us translate this app</value>
</data> </data>
@@ -954,9 +933,6 @@
<data name="SettingsPageJapanese.Header" xml:space="preserve"> <data name="SettingsPageJapanese.Header" xml:space="preserve">
<value>Japanese Phonetic</value> <value>Japanese Phonetic</value>
</data> </data>
<data name="SettingsPageJoinNowButton.Content" xml:space="preserve">
<value>Join Now</value>
</data>
<data name="SettingsPageJyutping.Content" xml:space="preserve"> <data name="SettingsPageJyutping.Content" xml:space="preserve">
<value>Jyutping (Cantonese)</value> <value>Jyutping (Cantonese)</value>
</data> </data>
@@ -1005,18 +981,12 @@
<data name="SettingsPageLight.Content" xml:space="preserve"> <data name="SettingsPageLight.Content" xml:space="preserve">
<value>Light</value> <value>Light</value>
</data> </data>
<data name="SettingsPageLinkedFile.Text" xml:space="preserve">
<value>Linked Local File</value>
</data>
<data name="SettingsPageListenNewSession.Header" xml:space="preserve"> <data name="SettingsPageListenNewSession.Header" xml:space="preserve">
<value>Enable listening for new playback sessions</value> <value>Enable listening for new playback sessions</value>
</data> </data>
<data name="SettingsPageLocalFolder.Text" xml:space="preserve"> <data name="SettingsPageLocalFolder.Text" xml:space="preserve">
<value>Local Folder</value> <value>Local Folder</value>
</data> </data>
<data name="SettingsPageLog.Header" xml:space="preserve">
<value>Logging</value>
</data>
<data name="SettingsPageLongSyllableDuration.Header" xml:space="preserve"> <data name="SettingsPageLongSyllableDuration.Header" xml:space="preserve">
<value>Long Syllable Threshold</value> <value>Long Syllable Threshold</value>
</data> </data>
@@ -1071,15 +1041,6 @@
<data name="SettingsPageLyricsFgFontColor.Header" xml:space="preserve"> <data name="SettingsPageLyricsFgFontColor.Header" xml:space="preserve">
<value>Current Line</value> <value>Current Line</value>
</data> </data>
<data name="SettingsPageLyricsFgFontColorAdaptiveColored.Content" xml:space="preserve">
<value>Adapt to Lyrics Background (Colored)</value>
</data>
<data name="SettingsPageLyricsFgFontColorAdaptiveGrayed.Content" xml:space="preserve">
<value>Adapt to Lyrics Background (Grayed)</value>
</data>
<data name="SettingsPageLyricsFgFontColorCustom.Content" xml:space="preserve">
<value>Custom</value>
</data>
<data name="SettingsPageLyricsFloatAnimation.Header" xml:space="preserve"> <data name="SettingsPageLyricsFloatAnimation.Header" xml:space="preserve">
<value>Float Animation</value> <value>Float Animation</value>
</data> </data>
@@ -1107,27 +1068,12 @@
<data name="SettingsPageLyricsGlowEffect.Header" xml:space="preserve"> <data name="SettingsPageLyricsGlowEffect.Header" xml:space="preserve">
<value>Glow Effect</value> <value>Glow Effect</value>
</data> </data>
<data name="SettingsPageLyricsHighlight.Header" xml:space="preserve">
<value>Highlight</value>
</data>
<data name="SettingsPageLyricsHighlightScope.Header" xml:space="preserve">
<value>Original Text Highlight Scope</value>
</data>
<data name="SettingsPageLyricsLeft.Content" xml:space="preserve">
<value>Left</value>
</data>
<data name="SettingsPageLyricsLight.Content" xml:space="preserve"> <data name="SettingsPageLyricsLight.Content" xml:space="preserve">
<value>Light</value> <value>Light</value>
</data> </data>
<data name="SettingsPageLyricsLineFade.Header" xml:space="preserve">
<value>Play Area Edge Fade</value>
</data>
<data name="SettingsPageLyricsLineSpacingFactor.Header" xml:space="preserve"> <data name="SettingsPageLyricsLineSpacingFactor.Header" xml:space="preserve">
<value>Line Spacing</value> <value>Line Spacing</value>
</data> </data>
<data name="SettingsPageLyricsLineSpacingFactorUnit.Text" xml:space="preserve">
<value> x Line Height</value>
</data>
<data name="SettingsPageLyricsMedium.Content" xml:space="preserve"> <data name="SettingsPageLyricsMedium.Content" xml:space="preserve">
<value>Medium</value> <value>Medium</value>
</data> </data>
@@ -1170,9 +1116,6 @@
<data name="SettingsPageLyricsSemiLight.Content" xml:space="preserve"> <data name="SettingsPageLyricsSemiLight.Content" xml:space="preserve">
<value>Semi Light</value> <value>Semi Light</value>
</data> </data>
<data name="SettingsPageLyricsShadow.Header" xml:space="preserve">
<value>Shadow</value>
</data>
<data name="SettingsPageLyricsStyle.Text" xml:space="preserve"> <data name="SettingsPageLyricsStyle.Text" xml:space="preserve">
<value>Lyrics Style</value> <value>Lyrics Style</value>
</data> </data>
@@ -1188,30 +1131,15 @@
<data name="SettingsPageLyricsTimelineThreshold.Header" xml:space="preserve"> <data name="SettingsPageLyricsTimelineThreshold.Header" xml:space="preserve">
<value>Lyrics Timeline Sync Threshold</value> <value>Lyrics Timeline Sync Threshold</value>
</data> </data>
<data name="SettingsPageLyricsTranslationHighlight.Header" xml:space="preserve">
<value>Translation Highlight</value>
</data>
<data name="SettingsPageLyricsTranslationSeparator.Header" xml:space="preserve">
<value>Original-Translation Separator</value>
</data>
<data name="SettingsPageLyricsVerticalEdgeOpacity.Header" xml:space="preserve">
<value>Vertical Edge Opacity</value>
</data>
<data name="SettingsPageLyricsWindow.Text" xml:space="preserve"> <data name="SettingsPageLyricsWindow.Text" xml:space="preserve">
<value>Lyrics Window</value> <value>Lyrics Window</value>
</data> </data>
<data name="SettingsPageLyricsWindowManager.Text" xml:space="preserve">
<value>Lyrics Window Manager</value>
</data>
<data name="SettingsPageLyricsWindowMgr.Content" xml:space="preserve"> <data name="SettingsPageLyricsWindowMgr.Content" xml:space="preserve">
<value>Lyrics Window Manager</value> <value>Lyrics Window Manager</value>
</data> </data>
<data name="SettingsPageLyricsWindowSwitchHotKey.Header" xml:space="preserve"> <data name="SettingsPageLyricsWindowSwitchHotKey.Header" xml:space="preserve">
<value>Lyrics Window Status Switch Shortcut</value> <value>Lyrics Window Status Switch Shortcut</value>
</data> </data>
<data name="SettingsPageLyricsWindowToolTip.Content" xml:space="preserve">
<value>Lyrics Window</value>
</data>
<data name="SettingsPageMatchingThreshold.Description" xml:space="preserve"> <data name="SettingsPageMatchingThreshold.Description" xml:space="preserve">
<value>Adjusting this value will affect sequential search and best match search results, but will not affect search results in the manual lyrics search interface</value> <value>Adjusting this value will affect sequential search and best match search results, but will not affect search results in the manual lyrics search interface</value>
</data> </data>
@@ -1248,18 +1176,12 @@
<data name="SettingsPageMusicLib.Header" xml:space="preserve"> <data name="SettingsPageMusicLib.Header" xml:space="preserve">
<value>Local Media Library</value> <value>Local Media Library</value>
</data> </data>
<data name="SettingsPageMusicLibRealTimeWatch.Header" xml:space="preserve">
<value>Real-time file monitoring</value>
</data>
<data name="SettingsPageNarrowMode.Text" xml:space="preserve"> <data name="SettingsPageNarrowMode.Text" xml:space="preserve">
<value>Narrow Mode</value> <value>Narrow Mode</value>
</data> </data>
<data name="SettingsPageNextSongHotKey.Header" xml:space="preserve"> <data name="SettingsPageNextSongHotKey.Header" xml:space="preserve">
<value>Next Track Shortcut</value> <value>Next Track Shortcut</value>
</data> </data>
<data name="SettingsPageNoBackdrop.Content" xml:space="preserve">
<value>None</value>
</data>
<data name="SettingsPageOctTree.Content" xml:space="preserve"> <data name="SettingsPageOctTree.Content" xml:space="preserve">
<value>Aggressive</value> <value>Aggressive</value>
</data> </data>
@@ -1287,9 +1209,6 @@
<data name="SettingsPagePathIncludingOthersInfo" xml:space="preserve"> <data name="SettingsPagePathIncludingOthersInfo" xml:space="preserve">
<value>This folder contains already added folders, please remove them to add this folder</value> <value>This folder contains already added folders, please remove them to add this folder</value>
</data> </data>
<data name="SettingsPagePathNotFound.Text" xml:space="preserve">
<value>Unable to find this path on your computer</value>
</data>
<data name="SettingsPagePatrons.Text" xml:space="preserve"> <data name="SettingsPagePatrons.Text" xml:space="preserve">
<value>Sponsorship</value> <value>Sponsorship</value>
</data> </data>
@@ -1335,15 +1254,9 @@
<data name="SettingsPageRealtimeStatus.Text" xml:space="preserve"> <data name="SettingsPageRealtimeStatus.Text" xml:space="preserve">
<value>Real-time Status</value> <value>Real-time Status</value>
</data> </data>
<data name="SettingsPageRecord.Content" xml:space="preserve">
<value>Record</value>
</data>
<data name="SettingsPageRecordedWindowStatus.Text" xml:space="preserve"> <data name="SettingsPageRecordedWindowStatus.Text" xml:space="preserve">
<value>Recorded Window Status</value> <value>Recorded Window Status</value>
</data> </data>
<data name="SettingsPageReference.Header" xml:space="preserve">
<value>References</value>
</data>
<data name="SettingsPageRefreshDropdown.Content" xml:space="preserve"> <data name="SettingsPageRefreshDropdown.Content" xml:space="preserve">
<value>Refresh Dropdown</value> <value>Refresh Dropdown</value>
</data> </data>
@@ -1362,9 +1275,6 @@
<data name="SettingsPageRight.Content" xml:space="preserve"> <data name="SettingsPageRight.Content" xml:space="preserve">
<value>Right</value> <value>Right</value>
</data> </data>
<data name="SettingsPageRomaji.Header" xml:space="preserve">
<value>Japanese Phonetic</value>
</data>
<data name="SettingsPageScope.Header" xml:space="preserve"> <data name="SettingsPageScope.Header" xml:space="preserve">
<value>Scope</value> <value>Scope</value>
</data> </data>
@@ -1404,6 +1314,9 @@
<data name="SettingsPageSettingsManager.Header" xml:space="preserve"> <data name="SettingsPageSettingsManager.Header" xml:space="preserve">
<value>Settings Manager</value> <value>Settings Manager</value>
</data> </data>
<data name="SettingsPageSettingsPlayHistory.Header" xml:space="preserve">
<value>Play History</value>
</data>
<data name="SettingsPageShareHub.Content" xml:space="preserve"> <data name="SettingsPageShareHub.Content" xml:space="preserve">
<value>Browse Online Share Hub</value> <value>Browse Online Share Hub</value>
</data> </data>
@@ -1431,18 +1344,12 @@
<data name="SettingsPageShowInSwitchers.Header" xml:space="preserve"> <data name="SettingsPageShowInSwitchers.Header" xml:space="preserve">
<value>Show in System Environment</value> <value>Show in System Environment</value>
</data> </data>
<data name="SettingsPageShowLayoutDragger.Header" xml:space="preserve">
<value>Show Layout Splitter</value>
</data>
<data name="SettingsPageShowTitle.Header" xml:space="preserve"> <data name="SettingsPageShowTitle.Header" xml:space="preserve">
<value>Show Title</value> <value>Show Title</value>
</data> </data>
<data name="SettingsPageSlide.Content" xml:space="preserve"> <data name="SettingsPageSlide.Content" xml:space="preserve">
<value>Slide</value> <value>Slide</value>
</data> </data>
<data name="SettingsPageSliderPrefix.Text" xml:space="preserve">
<value>Current Value: </value>
</data>
<data name="SettingsPageSnowFlakeLayer.Header" xml:space="preserve"> <data name="SettingsPageSnowFlakeLayer.Header" xml:space="preserve">
<value>Snowflake Layer</value> <value>Snowflake Layer</value>
</data> </data>
@@ -1485,6 +1392,9 @@
<data name="SettingsPageStartup.Text" xml:space="preserve"> <data name="SettingsPageStartup.Text" xml:space="preserve">
<value>Startup</value> <value>Startup</value>
</data> </data>
<data name="SettingsPageStats.Content" xml:space="preserve">
<value>Statistics</value>
</data>
<data name="SettingsPageStopTrackOnGalleryWindowClosed.Header" xml:space="preserve"> <data name="SettingsPageStopTrackOnGalleryWindowClosed.Header" xml:space="preserve">
<value>Stop playback when Music Gallery window is closed</value> <value>Stop playback when Music Gallery window is closed</value>
</data> </data>
@@ -1503,9 +1413,6 @@
<data name="SettingsPageTaskbarPlacement.Header" xml:space="preserve"> <data name="SettingsPageTaskbarPlacement.Header" xml:space="preserve">
<value>Taskbar Pin Position</value> <value>Taskbar Pin Position</value>
</data> </data>
<data name="SettingsPageThanksForPurchasing.Text" xml:space="preserve">
<value>Thanks for purchasing BetterLyrics</value>
</data>
<data name="SettingsPageThanksList.Header" xml:space="preserve"> <data name="SettingsPageThanksList.Header" xml:space="preserve">
<value>Credits</value> <value>Credits</value>
</data> </data>
@@ -1524,12 +1431,6 @@
<data name="SettingsPageTitleBarAreaWhole.Content" xml:space="preserve"> <data name="SettingsPageTitleBarAreaWhole.Content" xml:space="preserve">
<value>Whole Window</value> <value>Whole Window</value>
</data> </data>
<data name="SettingsPageTitleBarType.Header" xml:space="preserve">
<value>Title Bar Size</value>
</data>
<data name="SettingsPageToggleHotKey.Header" xml:space="preserve">
<value>Toggle Active/Inactive Shortcut</value>
</data>
<data name="SettingsPageTranslatedText.Header" xml:space="preserve"> <data name="SettingsPageTranslatedText.Header" xml:space="preserve">
<value>Translation</value> <value>Translation</value>
</data> </data>
@@ -1539,9 +1440,6 @@
<data name="SettingsPageTranslationConfig.Header" xml:space="preserve"> <data name="SettingsPageTranslationConfig.Header" xml:space="preserve">
<value>LibreTranslate Service</value> <value>LibreTranslate Service</value>
</data> </data>
<data name="SettingsPageTranslationInfoLink.Text" xml:space="preserve">
<value>Visit https://github.com/LibreTranslate/LibreTranslate for installation tutorial and more info (This software is not affiliated with this service)</value>
</data>
<data name="SettingsPageUserWhoPurchased.Text" xml:space="preserve"> <data name="SettingsPageUserWhoPurchased.Text" xml:space="preserve">
<value>And users who purchased BetterLyrics</value> <value>And users who purchased BetterLyrics</value>
</data> </data>
@@ -1554,9 +1452,6 @@
<data name="SettingsPageWidth.Header" xml:space="preserve"> <data name="SettingsPageWidth.Header" xml:space="preserve">
<value>Width</value> <value>Width</value>
</data> </data>
<data name="SettingsPageWindowBounds.Header" xml:space="preserve">
<value>Window Bounds</value>
</data>
<data name="SettingsPageWorkArea.Description" xml:space="preserve"> <data name="SettingsPageWorkArea.Description" xml:space="preserve">
<value>As a separate work area, docked to the top/bottom edge of the screen</value> <value>As a separate work area, docked to the top/bottom edge of the screen</value>
</data> </data>
@@ -1572,6 +1467,39 @@
<data name="StandardMode" xml:space="preserve"> <data name="StandardMode" xml:space="preserve">
<value>Standard Mode</value> <value>Standard Mode</value>
</data> </data>
<data name="StatsDashboardControlSources.Text" xml:space="preserve">
<value>Sources</value>
</data>
<data name="StatsDashboardControlThisMonth.Header" xml:space="preserve">
<value>This Month</value>
</data>
<data name="StatsDashboardControlThisQuarter.Header" xml:space="preserve">
<value>This Quarter</value>
</data>
<data name="StatsDashboardControlThisWeek.Header" xml:space="preserve">
<value>This Week</value>
</data>
<data name="StatsDashboardControlThisYear.Header" xml:space="preserve">
<value>This Year</value>
</data>
<data name="StatsDashboardControlToday.Header" xml:space="preserve">
<value>Today</value>
</data>
<data name="StatsDashboardControlTopArtists.Text" xml:space="preserve">
<value>Top Artists</value>
</data>
<data name="StatsDashboardControlTopSongs.Text" xml:space="preserve">
<value>Top Tracks</value>
</data>
<data name="StatsDashboardControlTopSource.Text" xml:space="preserve">
<value>Top Source</value>
</data>
<data name="StatsDashboardControlTotalDuration.Text" xml:space="preserve">
<value>Total Duration</value>
</data>
<data name="StatsDashboardControlTracksPlayed.Text" xml:space="preserve">
<value>Tracks Played</value>
</data>
<data name="SystemTrayExit.Text" xml:space="preserve"> <data name="SystemTrayExit.Text" xml:space="preserve">
<value>Exit</value> <value>Exit</value>
</data> </data>
@@ -1581,9 +1509,6 @@
<data name="SystemTrayMusicGallery.Text" xml:space="preserve"> <data name="SystemTrayMusicGallery.Text" xml:space="preserve">
<value>Open Music Gallery</value> <value>Open Music Gallery</value>
</data> </data>
<data name="SystemTrayPageTitle" xml:space="preserve">
<value>System Tray - BetterLyrics</value>
</data>
<data name="SystemTrayResetWindowPosition.Text" xml:space="preserve"> <data name="SystemTrayResetWindowPosition.Text" xml:space="preserve">
<value>Reset Window Position</value> <value>Reset Window Position</value>
</data> </data>

View File

@@ -129,21 +129,12 @@
<data name="AlbumArtSearchSMTCProvider" xml:space="preserve"> <data name="AlbumArtSearchSMTCProvider" xml:space="preserve">
<value>Reproductor de música</value> <value>Reproductor de música</value>
</data> </data>
<data name="AllLyricsSettingsControlPictureInPicture.Content" xml:space="preserve">
<value>Modo Imagen en Imagen (PiP)</value>
</data>
<data name="AppSettingsControlGeneral.Text" xml:space="preserve"> <data name="AppSettingsControlGeneral.Text" xml:space="preserve">
<value>Ventana</value> <value>Ventana</value>
</data> </data>
<data name="ArtistsSplitHint.Text" xml:space="preserve"> <data name="ArtistsSplitHint.Text" xml:space="preserve">
<value>Al ingresar varios artistas, sepárelos usando uno de los siguientes delimitadores (no mezclar)</value> <value>Al ingresar varios artistas, sepárelos usando uno de los siguientes delimitadores (no mezclar)</value>
</data> </data>
<data name="BaseWindowHostInfoBarCheckBox.Content" xml:space="preserve">
<value>No volver a mostrar este mensaje</value>
</data>
<data name="BaseWindowMiniFlyoutItem.Text" xml:space="preserve">
<value>Modo Imagen en Imagen</value>
</data>
<data name="Cancel" xml:space="preserve"> <data name="Cancel" xml:space="preserve">
<value>Cancelar</value> <value>Cancelar</value>
</data> </data>
@@ -168,24 +159,45 @@
<data name="DockedMode" xml:space="preserve"> <data name="DockedMode" xml:space="preserve">
<value>Modo Acoplado</value> <value>Modo Acoplado</value>
</data> </data>
<data name="Error" xml:space="preserve">
<value>Error</value>
</data>
<data name="ExportSettingsSuccess" xml:space="preserve"> <data name="ExportSettingsSuccess" xml:space="preserve">
<value>Exportación exitosa</value> <value>Exportación exitosa</value>
</data> </data>
<data name="FailToStartLXMusicServer" xml:space="preserve"> <data name="FailToStartLXMusicServer" xml:space="preserve">
<value>No se puede conectar al servidor LX Music. Vaya a Configuración - Fuente de reproducción - LX Music - Servidor LX Music para verificar si el enlace es correcto</value> <value>No se puede conectar al servidor LX Music. Vaya a Configuración - Fuente de reproducción - LX Music - Servidor LX Music para verificar si el enlace es correcto</value>
</data> </data>
<data name="FileSystemServiceCleaningCache" xml:space="preserve">
<value>Limpiando caché...</value>
</data>
<data name="FileSystemServiceConnectFailed" xml:space="preserve">
<value>Conexión fallida</value>
</data>
<data name="FileSystemServiceConnecting" xml:space="preserve">
<value>Conectando...</value>
</data>
<data name="FileSystemServiceFetchingFileList" xml:space="preserve">
<value>Obteniendo lista de archivos...</value>
</data>
<data name="FileSystemServiceParsing" xml:space="preserve">
<value>Parsing...</value>
</data>
<data name="FileSystemServicePrepareToClean" xml:space="preserve">
<value>Preparando la limpieza de caché...</value>
</data>
<data name="FileSystemServiceReady" xml:space="preserve">
<value>Listo</value>
</data>
<data name="FileSystemServiceRootDirectoryWarning" xml:space="preserve">
<value>Se ha detectado la ruta del directorio raíz. Un índice de disco completo puede contener un gran número de archivos no multimedia y hacer que la exploración dure demasiado tiempo. Se recomienda especificar un subdirectorio concreto.</value>
</data>
<data name="FileSystemServiceWaitingForScan" xml:space="preserve">
<value>Esperando para escanear...</value>
</data>
<data name="FullscreenMode" xml:space="preserve"> <data name="FullscreenMode" xml:space="preserve">
<value>Modo Pantalla Completa</value> <value>Modo Pantalla Completa</value>
</data> </data>
<data name="HostWindowClickThroughButton.Content" xml:space="preserve">
<value>Bloquear</value>
</data>
<data name="HostWindowClickThroughFlyoutItem.Text" xml:space="preserve">
<value>Bloquear</value>
</data>
<data name="HostWindowLockToolTip.Text" xml:space="preserve">
<value>Bloquear</value>
</data>
<data name="HostWindowMusicGalleryButtonToolTip.Content" xml:space="preserve"> <data name="HostWindowMusicGalleryButtonToolTip.Content" xml:space="preserve">
<value>Galería de Música</value> <value>Galería de Música</value>
</data> </data>
@@ -204,9 +216,6 @@
<data name="Jyutping" xml:space="preserve"> <data name="Jyutping" xml:space="preserve">
<value>Jyutping (Cantonés)</value> <value>Jyutping (Cantonés)</value>
</data> </data>
<data name="KeepAtLeastOneStatusDefault" xml:space="preserve">
<value>Asegúrese de que al menos un estado esté configurado como predeterminado</value>
</data>
<data name="LastFMAuthFailed" xml:space="preserve"> <data name="LastFMAuthFailed" xml:space="preserve">
<value>Error de autorización, inténtelo de nuevo</value> <value>Error de autorización, inténtelo de nuevo</value>
</data> </data>
@@ -270,18 +279,12 @@
<data name="LyricsPageSettings.Text" xml:space="preserve"> <data name="LyricsPageSettings.Text" xml:space="preserve">
<value>Configuración</value> <value>Configuración</value>
</data> </data>
<data name="LyricsPageTimelineOffsetButtonToolTip.Content" xml:space="preserve">
<value>Desplazamiento de la línea de tiempo de la letra</value>
</data>
<data name="LyricsPageTranslationEnabled.Description" xml:space="preserve"> <data name="LyricsPageTranslationEnabled.Description" xml:space="preserve">
<value>Priorizar la lectura de traducciones dentro de la letra; si no hay coincidencia, solicitar traducción automática al servidor LibreTranslate</value> <value>Priorizar la lectura de traducciones dentro de la letra; si no hay coincidencia, solicitar traducción automática al servidor LibreTranslate</value>
</data> </data>
<data name="LyricsPageTranslationEnabled.Header" xml:space="preserve"> <data name="LyricsPageTranslationEnabled.Header" xml:space="preserve">
<value>Habilitar traducción</value> <value>Habilitar traducción</value>
</data> </data>
<data name="LyricsPageTranslationOnly.Header" xml:space="preserve">
<value>Mostrar solo traducción</value>
</data>
<data name="LyricsPageTranslationProviderPrefix.Header" xml:space="preserve"> <data name="LyricsPageTranslationProviderPrefix.Header" xml:space="preserve">
<value>Proveedor de traducción</value> <value>Proveedor de traducción</value>
</data> </data>
@@ -330,9 +333,6 @@
<data name="LyricsSearchControlSongInfoMapping.Text" xml:space="preserve"> <data name="LyricsSearchControlSongInfoMapping.Text" xml:space="preserve">
<value>Mapeo de información de la canción</value> <value>Mapeo de información de la canción</value>
</data> </data>
<data name="LyricsSearchControlTargetSearchProvider.Header" xml:space="preserve">
<value>Proveedor de búsqueda de letras de destino</value>
</data>
<data name="LyricsSearchControlTitle.Header" xml:space="preserve"> <data name="LyricsSearchControlTitle.Header" xml:space="preserve">
<value>Título</value> <value>Título</value>
</data> </data>
@@ -351,15 +351,9 @@
<data name="LyricsSearchProviderTtmlFile" xml:space="preserve"> <data name="LyricsSearchProviderTtmlFile" xml:space="preserve">
<value>Archivo .TTML local</value> <value>Archivo .TTML local</value>
</data> </data>
<data name="LyricsWindowImmersiveButtonToolTip.Content" xml:space="preserve">
<value>Modo Inmersivo</value>
</data>
<data name="LyricsWindowSettingsControlLyricsWindowConfig.Text" xml:space="preserve"> <data name="LyricsWindowSettingsControlLyricsWindowConfig.Text" xml:space="preserve">
<value>Configuración</value> <value>Configuración</value>
</data> </data>
<data name="LyricsWindowSettingsControlLyricsWindowMode.Header" xml:space="preserve">
<value>Modo de ventana de letras</value>
</data>
<data name="LyricsWindowSettingsControlSetDefault.Text" xml:space="preserve"> <data name="LyricsWindowSettingsControlSetDefault.Text" xml:space="preserve">
<value>Establecer como predeterminado</value> <value>Establecer como predeterminado</value>
</data> </data>
@@ -378,9 +372,6 @@
<data name="MainPageAlbumArtOnly.Content" xml:space="preserve"> <data name="MainPageAlbumArtOnly.Content" xml:space="preserve">
<value>Mostrar solo área de portada del álbum</value> <value>Mostrar solo área de portada del álbum</value>
</data> </data>
<data name="MainPageEnterImmersiveModeHint" xml:space="preserve">
<value>Pase el cursor de nuevo para mostrar el botón de alternancia</value>
</data>
<data name="MainPageLyriscOnly.Content" xml:space="preserve"> <data name="MainPageLyriscOnly.Content" xml:space="preserve">
<value>Mostrar solo letra</value> <value>Mostrar solo letra</value>
</data> </data>
@@ -396,6 +387,18 @@
<data name="MainPageSplitView.Content" xml:space="preserve"> <data name="MainPageSplitView.Content" xml:space="preserve">
<value>Vista dividida</value> <value>Vista dividida</value>
</data> </data>
<data name="MediaSettingsControlLastSyncTime.Header" xml:space="preserve">
<value>Última sincronización</value>
</data>
<data name="MediaSettingsControlLocalFolder" xml:space="preserve">
<value>Carpeta local</value>
</data>
<data name="MediaSettingsControlNameSetting.Header" xml:space="preserve">
<value>Nombre</value>
</data>
<data name="MediaSettingsControlSyncNow.Content" xml:space="preserve">
<value>Sincronizar ahora</value>
</data>
<data name="MusicGalleryPageAddToCustomList.Text" xml:space="preserve"> <data name="MusicGalleryPageAddToCustomList.Text" xml:space="preserve">
<value>Añadir a lista de reproducción</value> <value>Añadir a lista de reproducción</value>
</data> </data>
@@ -406,11 +409,17 @@
<value>Siguiente elemento</value> <value>Siguiente elemento</value>
</data> </data>
<data name="MusicGalleryPageAddToPlayingQueue.Text" xml:space="preserve"> <data name="MusicGalleryPageAddToPlayingQueue.Text" xml:space="preserve">
<value>Añadir a la cola</value> <value>Añadir a la cola de reproducción</value>
</data> </data>
<data name="MusicGalleryPageAllSongs" xml:space="preserve"> <data name="MusicGalleryPageAllSongs" xml:space="preserve">
<value>Toda la música</value> <value>Toda la música</value>
</data> </data>
<data name="MusicGalleryPageDataSync.Message" xml:space="preserve">
<value>Sincronización de la biblioteca multimedia en curso...</value>
</data>
<data name="MusicGalleryPageDataSyncError.Message" xml:space="preserve">
<value>Hay un problema con la sincronización de la biblioteca multimedia</value>
</data>
<data name="MusicGalleryPageEmptyPlayingQueue.Text" xml:space="preserve"> <data name="MusicGalleryPageEmptyPlayingQueue.Text" xml:space="preserve">
<value>Borrar cola</value> <value>Borrar cola</value>
</data> </data>
@@ -420,9 +429,6 @@
<data name="MusicGalleryPageFileArtist.Header" xml:space="preserve"> <data name="MusicGalleryPageFileArtist.Header" xml:space="preserve">
<value>Artista</value> <value>Artista</value>
</data> </data>
<data name="MusicGalleryPageFileInfo.Text" xml:space="preserve">
<value>Información del archivo</value>
</data>
<data name="MusicGalleryPageFileInfoBitDepth.Header" xml:space="preserve"> <data name="MusicGalleryPageFileInfoBitDepth.Header" xml:space="preserve">
<value>Profundidad de bits</value> <value>Profundidad de bits</value>
</data> </data>
@@ -456,15 +462,15 @@
<data name="MusicGalleryPageFileNotFound.Text" xml:space="preserve"> <data name="MusicGalleryPageFileNotFound.Text" xml:space="preserve">
<value>No se encontraron canciones en la biblioteca multimedia</value> <value>No se encontraron canciones en la biblioteca multimedia</value>
</data> </data>
<data name="MusicGalleryPageFolder.Text" xml:space="preserve">
<value>Carpetas</value>
</data>
<data name="MusicGalleryPageImportFromFile.Text" xml:space="preserve"> <data name="MusicGalleryPageImportFromFile.Text" xml:space="preserve">
<value>Importar desde archivo</value> <value>Importar desde archivo</value>
</data> </data>
<data name="MusicGalleryPageNewPlaylist.Text" xml:space="preserve"> <data name="MusicGalleryPageNewPlaylist.Text" xml:space="preserve">
<value>Crear lista de reproducción</value> <value>Crear lista de reproducción</value>
</data> </data>
<data name="MusicGalleryPagePlayAll.Content" xml:space="preserve">
<value>Reproducir todo</value>
</data>
<data name="MusicGalleryPagePlayingQueue.Text" xml:space="preserve"> <data name="MusicGalleryPagePlayingQueue.Text" xml:space="preserve">
<value>Cola de reproducción</value> <value>Cola de reproducción</value>
</data> </data>
@@ -472,7 +478,7 @@
<value>La cola de reproducción está vacía</value> <value>La cola de reproducción está vacía</value>
</data> </data>
<data name="MusicGalleryPagePlaylist.Text" xml:space="preserve"> <data name="MusicGalleryPagePlaylist.Text" xml:space="preserve">
<value>Lista de reproducción</value> <value>Listas de reproducción</value>
</data> </data>
<data name="MusicGalleryPageQueueLoop.Text" xml:space="preserve"> <data name="MusicGalleryPageQueueLoop.Text" xml:space="preserve">
<value>Repetir lista</value> <value>Repetir lista</value>
@@ -489,9 +495,6 @@
<data name="MusicGalleryPageScrollToPlayingItem.Text" xml:space="preserve"> <data name="MusicGalleryPageScrollToPlayingItem.Text" xml:space="preserve">
<value>Desplazarse al elemento en reproducción</value> <value>Desplazarse al elemento en reproducción</value>
</data> </data>
<data name="MusicGalleryPageSelectAll.Content" xml:space="preserve">
<value>Seleccionar todo</value>
</data>
<data name="MusicGalleryPageSingleLoop.Text" xml:space="preserve"> <data name="MusicGalleryPageSingleLoop.Text" xml:space="preserve">
<value>Repetir una</value> <value>Repetir una</value>
</data> </data>
@@ -513,20 +516,29 @@
<data name="MusicGalleryPageSortType.Text" xml:space="preserve"> <data name="MusicGalleryPageSortType.Text" xml:space="preserve">
<value>Tipo de orden</value> <value>Tipo de orden</value>
</data> </data>
<data name="MusicGalleryPageStarredPlaylist.Content" xml:space="preserve">
<value>Lista de destacados</value>
</data>
<data name="MusicGalleryPageStopTrack.Text" xml:space="preserve"> <data name="MusicGalleryPageStopTrack.Text" xml:space="preserve">
<value>Detener</value> <value>Detener</value>
</data> </data>
<data name="MusicGalleryPageTitle" xml:space="preserve"> <data name="MusicGalleryPageTitle" xml:space="preserve">
<value>Galería de Música - BetterLyrics</value> <value>Galería de Música - BetterLyrics</value>
</data> </data>
<data name="MusicGalleryWindowDownButtonToolTip.Content" xml:space="preserve"> <data name="MusicSettingsControlAutoSyncInterval.Header" xml:space="preserve">
<value>Contraer</value> <value>Frecuencia de sincronización automática</value>
</data> </data>
<data name="MusicGalleryWindowUpButtonToolTip.Content" xml:space="preserve"> <data name="MusicSettingsControlAutoSyncIntervalDisabled.Content" xml:space="preserve">
<value>Expandir</value> <value>Nunca</value>
</data>
<data name="MusicSettingsControlAutoSyncIntervalEveryDay.Content" xml:space="preserve">
<value>Todos los días</value>
</data>
<data name="MusicSettingsControlAutoSyncIntervalEveryFifteenMin.Content" xml:space="preserve">
<value>Cada 15 minutos</value>
</data>
<data name="MusicSettingsControlAutoSyncIntervalEveryHour.Content" xml:space="preserve">
<value>Cada hora</value>
</data>
<data name="MusicSettingsControlAutoSyncIntervalEverySixHrs.Content" xml:space="preserve">
<value>Cada 6 horas</value>
</data> </data>
<data name="NarrowMode" xml:space="preserve"> <data name="NarrowMode" xml:space="preserve">
<value>Modo Estrecho</value> <value>Modo Estrecho</value>
@@ -543,12 +555,27 @@
<data name="PrivacyPolicy.Content" xml:space="preserve"> <data name="PrivacyPolicy.Content" xml:space="preserve">
<value>Política de privacidad</value> <value>Política de privacidad</value>
</data> </data>
<data name="RemoteServerConfigControlBrowse.Content" xml:space="preserve">
<value>Visite</value>
</data>
<data name="RemoteServerConfigControlName.Header" xml:space="preserve">
<value>Nombre</value>
</data>
<data name="RemoteServerConfigControlName.PlaceholderText" xml:space="preserve">
<value>Si lo deja en blanco, se generará automáticamente un nombre por defecto.</value>
</data>
<data name="RemoteServerConfigControlPassword.Header" xml:space="preserve"> <data name="RemoteServerConfigControlPassword.Header" xml:space="preserve">
<value>Contraseña</value> <value>Contraseña</value>
</data> </data>
<data name="RemoteServerConfigControlPath.Header" xml:space="preserve"> <data name="RemoteServerConfigControlPath.Header" xml:space="preserve">
<value>Ruta</value> <value>Ruta</value>
</data> </data>
<data name="RemoteServerConfigControlPathNotExisted" xml:space="preserve">
<value>No se ha encontrado la ruta de la carpeta especificada</value>
</data>
<data name="RemoteServerConfigControlPathRequired" xml:space="preserve">
<value>La ruta es obligatoria</value>
</data>
<data name="RemoteServerConfigControlPort.Header" xml:space="preserve"> <data name="RemoteServerConfigControlPort.Header" xml:space="preserve">
<value>Puerto</value> <value>Puerto</value>
</data> </data>
@@ -576,9 +603,6 @@
<data name="SetingsPageFeedback.Text" xml:space="preserve"> <data name="SetingsPageFeedback.Text" xml:space="preserve">
<value>Comentarios</value> <value>Comentarios</value>
</data> </data>
<data name="SetingsPageInstructions.Text" xml:space="preserve">
<value>Instrucciones</value>
</data>
<data name="SetingsPageSpecialThanks.Text" xml:space="preserve"> <data name="SetingsPageSpecialThanks.Text" xml:space="preserve">
<value>Agradecimientos especiales</value> <value>Agradecimientos especiales</value>
</data> </data>
@@ -606,9 +630,6 @@
<data name="SettingsPageAddFolderButton.Content" xml:space="preserve"> <data name="SettingsPageAddFolderButton.Content" xml:space="preserve">
<value>Agregar</value> <value>Agregar</value>
</data> </data>
<data name="SettingsPageAdvanced.Text" xml:space="preserve">
<value>Opciones avanzadas</value>
</data>
<data name="SettingsPageAlbum.Header" xml:space="preserve"> <data name="SettingsPageAlbum.Header" xml:space="preserve">
<value>Álbum</value> <value>Álbum</value>
</data> </data>
@@ -624,15 +645,9 @@
<data name="SettingsPageAlbumArtSearchProvidersConfig.Text" xml:space="preserve"> <data name="SettingsPageAlbumArtSearchProvidersConfig.Text" xml:space="preserve">
<value>Configurar fuentes de portada de álbum</value> <value>Configurar fuentes de portada de álbum</value>
</data> </data>
<data name="SettingsPageAlbumArtSize.Header" xml:space="preserve">
<value>Tamaño de la portada del álbum</value>
</data>
<data name="SettingsPageAlbumEffect.Text" xml:space="preserve"> <data name="SettingsPageAlbumEffect.Text" xml:space="preserve">
<value>Efecto de portada del álbum</value> <value>Efecto de portada del álbum</value>
</data> </data>
<data name="SettingsPageAlbumLib.Content" xml:space="preserve">
<value>Fuentes de portada de álbum</value>
</data>
<data name="SettingsPageAlbumRadius.Header" xml:space="preserve"> <data name="SettingsPageAlbumRadius.Header" xml:space="preserve">
<value>Radio de esquina</value> <value>Radio de esquina</value>
</data> </data>
@@ -663,12 +678,6 @@
<data name="SettingsPageAppAppearance.Text" xml:space="preserve"> <data name="SettingsPageAppAppearance.Text" xml:space="preserve">
<value>Apariencia de la aplicación</value> <value>Apariencia de la aplicación</value>
</data> </data>
<data name="SettingsPageAppBehavior.Text" xml:space="preserve">
<value>Comportamiento general</value>
</data>
<data name="SettingsPageApply.Content" xml:space="preserve">
<value>Aplicar</value>
</data>
<data name="SettingsPageArtist.Header" xml:space="preserve"> <data name="SettingsPageArtist.Header" xml:space="preserve">
<value>Artista</value> <value>Artista</value>
</data> </data>
@@ -687,21 +696,12 @@
<data name="SettingsPageAutoStart.Header" xml:space="preserve"> <data name="SettingsPageAutoStart.Header" xml:space="preserve">
<value>Inicio automático</value> <value>Inicio automático</value>
</data> </data>
<data name="SettingsPageAutoStartWindow.Header" xml:space="preserve">
<value>Al iniciar la aplicación</value>
</data>
<data name="SettingsPageBackdrop.Header" xml:space="preserve">
<value>Material de fondo de letras</value>
</data>
<data name="SettingsPageBackgroundOverlay.Text" xml:space="preserve"> <data name="SettingsPageBackgroundOverlay.Text" xml:space="preserve">
<value>Fondo de letras</value> <value>Fondo de letras</value>
</data> </data>
<data name="SettingsPageBlurAmount.Header" xml:space="preserve"> <data name="SettingsPageBlurAmount.Header" xml:space="preserve">
<value>Cantidad de desenfoque</value> <value>Cantidad de desenfoque</value>
</data> </data>
<data name="SettingsPageBorderless.Header" xml:space="preserve">
<value>Ventana sin bordes</value>
</data>
<data name="SettingsPageCache.Description" xml:space="preserve"> <data name="SettingsPageCache.Description" xml:space="preserve">
<value>Incluye archivos de registro, caché de letras en línea</value> <value>Incluye archivos de registro, caché de letras en línea</value>
</data> </data>
@@ -738,9 +738,6 @@
<data name="SettingsPageCollapseDropdown.Content" xml:space="preserve"> <data name="SettingsPageCollapseDropdown.Content" xml:space="preserve">
<value>Contraer menú desplegable</value> <value>Contraer menú desplegable</value>
</data> </data>
<data name="SettingsPageCompactTitleBar.Content" xml:space="preserve">
<value>Compacto</value>
</data>
<data name="SettingsPageConfigName.Description" xml:space="preserve"> <data name="SettingsPageConfigName.Description" xml:space="preserve">
<value>Nombrar los estados de ventana grabados le ayuda a distinguirlos mejor</value> <value>Nombrar los estados de ventana grabados le ayuda a distinguirlos mejor</value>
</data> </data>
@@ -759,18 +756,12 @@
<data name="SettingsPageCrossfade.Content" xml:space="preserve"> <data name="SettingsPageCrossfade.Content" xml:space="preserve">
<value>Fundido cruzado</value> <value>Fundido cruzado</value>
</data> </data>
<data name="SettingsPageCurrentLyricsWindowStatus.Text" xml:space="preserve">
<value>Estado actual de la ventana de letras</value>
</data>
<data name="SettingsPageCutletDockerServer.Header" xml:space="preserve"> <data name="SettingsPageCutletDockerServer.Header" xml:space="preserve">
<value>Servicio de transliteración cutlet-docker</value> <value>Servicio de transliteración cutlet-docker</value>
</data> </data>
<data name="SettingsPageDark.Content" xml:space="preserve"> <data name="SettingsPageDark.Content" xml:space="preserve">
<value>Oscuro</value> <value>Oscuro</value>
</data> </data>
<data name="SettingsPageDebugOverlay.Header" xml:space="preserve">
<value>Mostrar superposición de depuración</value>
</data>
<data name="SettingsPageDelete.Text" xml:space="preserve"> <data name="SettingsPageDelete.Text" xml:space="preserve">
<value>Eliminar</value> <value>Eliminar</value>
</data> </data>
@@ -801,15 +792,9 @@
<data name="SettingsPageDockPlacementTop.Content" xml:space="preserve"> <data name="SettingsPageDockPlacementTop.Content" xml:space="preserve">
<value>Arriba</value> <value>Arriba</value>
</data> </data>
<data name="SettingsPageDockWindowHeight.Header" xml:space="preserve">
<value>Altura de la ventana</value>
</data>
<data name="SettingsPageDragArea.Header" xml:space="preserve"> <data name="SettingsPageDragArea.Header" xml:space="preserve">
<value>Área arrastrable</value> <value>Área arrastrable</value>
</data> </data>
<data name="SettingsPageEasingFuncType.Header" xml:space="preserve">
<value>Tipo de función de aceleración</value>
</data>
<data name="SettingsPageEasingTypeEaseInOutBack.Content" xml:space="preserve"> <data name="SettingsPageEasingTypeEaseInOutBack.Content" xml:space="preserve">
<value>Back Ease In-Out</value> <value>Back Ease In-Out</value>
</data> </data>
@@ -873,18 +858,15 @@
<data name="SettingsPageExitOnLyricsWindowClosed.Header" xml:space="preserve"> <data name="SettingsPageExitOnLyricsWindowClosed.Header" xml:space="preserve">
<value>Salir de la app al cerrar la ventana de letras</value> <value>Salir de la app al cerrar la ventana de letras</value>
</data> </data>
<data name="SettingsPageExportPlayHistoryButton.Content" xml:space="preserve">
<value>Exportar historial de jugadas</value>
</data>
<data name="SettingsPageExportSettingsButton.Content" xml:space="preserve"> <data name="SettingsPageExportSettingsButton.Content" xml:space="preserve">
<value>Exportar configuración</value> <value>Exportar configuración</value>
</data> </data>
<data name="SettingsPageExtendedTitleBar.Content" xml:space="preserve">
<value>Extendido</value>
</data>
<data name="SettingsPageFan.Header" xml:space="preserve"> <data name="SettingsPageFan.Header" xml:space="preserve">
<value>Letras en abanico</value> <value>Letras en abanico</value>
</data> </data>
<data name="SettingsPageFAQ.Content" xml:space="preserve">
<value>Preguntas frecuentes</value>
</data>
<data name="SettingsPageFixedTimeStep.Header" xml:space="preserve"> <data name="SettingsPageFixedTimeStep.Header" xml:space="preserve">
<value>Renderizado de paso de tiempo fijo</value> <value>Renderizado de paso de tiempo fijo</value>
</data> </data>
@@ -921,9 +903,6 @@
<data name="SettingsPageHeight.Header" xml:space="preserve"> <data name="SettingsPageHeight.Header" xml:space="preserve">
<value>Altura</value> <value>Altura</value>
</data> </data>
<data name="SettingsPageHello.Text" xml:space="preserve">
<value>Hola</value>
</data>
<data name="SettingsPageHelpUsTranslate.Content" xml:space="preserve"> <data name="SettingsPageHelpUsTranslate.Content" xml:space="preserve">
<value>Ayúdanos a traducir esta aplicación</value> <value>Ayúdanos a traducir esta aplicación</value>
</data> </data>
@@ -954,9 +933,6 @@
<data name="SettingsPageJapanese.Header" xml:space="preserve"> <data name="SettingsPageJapanese.Header" xml:space="preserve">
<value>Fonética japonesa</value> <value>Fonética japonesa</value>
</data> </data>
<data name="SettingsPageJoinNowButton.Content" xml:space="preserve">
<value>Unirse ahora</value>
</data>
<data name="SettingsPageJyutping.Content" xml:space="preserve"> <data name="SettingsPageJyutping.Content" xml:space="preserve">
<value>Jyutping (Cantonés)</value> <value>Jyutping (Cantonés)</value>
</data> </data>
@@ -1005,18 +981,12 @@
<data name="SettingsPageLight.Content" xml:space="preserve"> <data name="SettingsPageLight.Content" xml:space="preserve">
<value>Claro</value> <value>Claro</value>
</data> </data>
<data name="SettingsPageLinkedFile.Text" xml:space="preserve">
<value>Archivo local vinculado</value>
</data>
<data name="SettingsPageListenNewSession.Header" xml:space="preserve"> <data name="SettingsPageListenNewSession.Header" xml:space="preserve">
<value>Habilitar escucha de nuevas sesiones de reproducción</value> <value>Habilitar escucha de nuevas sesiones de reproducción</value>
</data> </data>
<data name="SettingsPageLocalFolder.Text" xml:space="preserve"> <data name="SettingsPageLocalFolder.Text" xml:space="preserve">
<value>Carpeta local</value> <value>Carpeta local</value>
</data> </data>
<data name="SettingsPageLog.Header" xml:space="preserve">
<value>Registro</value>
</data>
<data name="SettingsPageLongSyllableDuration.Header" xml:space="preserve"> <data name="SettingsPageLongSyllableDuration.Header" xml:space="preserve">
<value>Umbral de sílaba larga</value> <value>Umbral de sílaba larga</value>
</data> </data>
@@ -1071,15 +1041,6 @@
<data name="SettingsPageLyricsFgFontColor.Header" xml:space="preserve"> <data name="SettingsPageLyricsFgFontColor.Header" xml:space="preserve">
<value>Línea actual</value> <value>Línea actual</value>
</data> </data>
<data name="SettingsPageLyricsFgFontColorAdaptiveColored.Content" xml:space="preserve">
<value>Adaptar al fondo de letras (Coloreado)</value>
</data>
<data name="SettingsPageLyricsFgFontColorAdaptiveGrayed.Content" xml:space="preserve">
<value>Adaptar al fondo de letras (Grisáceo)</value>
</data>
<data name="SettingsPageLyricsFgFontColorCustom.Content" xml:space="preserve">
<value>Personalizado</value>
</data>
<data name="SettingsPageLyricsFloatAnimation.Header" xml:space="preserve"> <data name="SettingsPageLyricsFloatAnimation.Header" xml:space="preserve">
<value>Animación flotante</value> <value>Animación flotante</value>
</data> </data>
@@ -1107,27 +1068,12 @@
<data name="SettingsPageLyricsGlowEffect.Header" xml:space="preserve"> <data name="SettingsPageLyricsGlowEffect.Header" xml:space="preserve">
<value>Efecto de resplandor</value> <value>Efecto de resplandor</value>
</data> </data>
<data name="SettingsPageLyricsHighlight.Header" xml:space="preserve">
<value>Resaltado</value>
</data>
<data name="SettingsPageLyricsHighlightScope.Header" xml:space="preserve">
<value>Alcance de resaltado del texto original</value>
</data>
<data name="SettingsPageLyricsLeft.Content" xml:space="preserve">
<value>Izquierda</value>
</data>
<data name="SettingsPageLyricsLight.Content" xml:space="preserve"> <data name="SettingsPageLyricsLight.Content" xml:space="preserve">
<value>Ligero</value> <value>Ligero</value>
</data> </data>
<data name="SettingsPageLyricsLineFade.Header" xml:space="preserve">
<value>Desvanecimiento de borde del área de reproducción</value>
</data>
<data name="SettingsPageLyricsLineSpacingFactor.Header" xml:space="preserve"> <data name="SettingsPageLyricsLineSpacingFactor.Header" xml:space="preserve">
<value>Espaciado entre líneas</value> <value>Espaciado entre líneas</value>
</data> </data>
<data name="SettingsPageLyricsLineSpacingFactorUnit.Text" xml:space="preserve">
<value> x Altura de línea</value>
</data>
<data name="SettingsPageLyricsMedium.Content" xml:space="preserve"> <data name="SettingsPageLyricsMedium.Content" xml:space="preserve">
<value>Medio</value> <value>Medio</value>
</data> </data>
@@ -1170,9 +1116,6 @@
<data name="SettingsPageLyricsSemiLight.Content" xml:space="preserve"> <data name="SettingsPageLyricsSemiLight.Content" xml:space="preserve">
<value>Semiligero</value> <value>Semiligero</value>
</data> </data>
<data name="SettingsPageLyricsShadow.Header" xml:space="preserve">
<value>Sombra</value>
</data>
<data name="SettingsPageLyricsStyle.Text" xml:space="preserve"> <data name="SettingsPageLyricsStyle.Text" xml:space="preserve">
<value>Estilo de letras</value> <value>Estilo de letras</value>
</data> </data>
@@ -1188,30 +1131,15 @@
<data name="SettingsPageLyricsTimelineThreshold.Header" xml:space="preserve"> <data name="SettingsPageLyricsTimelineThreshold.Header" xml:space="preserve">
<value>Umbral de sincronización de línea de tiempo de letras</value> <value>Umbral de sincronización de línea de tiempo de letras</value>
</data> </data>
<data name="SettingsPageLyricsTranslationHighlight.Header" xml:space="preserve">
<value>Resaltado de traducción</value>
</data>
<data name="SettingsPageLyricsTranslationSeparator.Header" xml:space="preserve">
<value>Separador Original-Traducción</value>
</data>
<data name="SettingsPageLyricsVerticalEdgeOpacity.Header" xml:space="preserve">
<value>Opacidad de borde vertical</value>
</data>
<data name="SettingsPageLyricsWindow.Text" xml:space="preserve"> <data name="SettingsPageLyricsWindow.Text" xml:space="preserve">
<value>Ventana de letras</value> <value>Ventana de letras</value>
</data> </data>
<data name="SettingsPageLyricsWindowManager.Text" xml:space="preserve">
<value>Gestor de ventanas de letras</value>
</data>
<data name="SettingsPageLyricsWindowMgr.Content" xml:space="preserve"> <data name="SettingsPageLyricsWindowMgr.Content" xml:space="preserve">
<value>Gestor de ventanas de letras</value> <value>Gestor de ventanas de letras</value>
</data> </data>
<data name="SettingsPageLyricsWindowSwitchHotKey.Header" xml:space="preserve"> <data name="SettingsPageLyricsWindowSwitchHotKey.Header" xml:space="preserve">
<value>Atajo de cambio de estado de ventana de letras</value> <value>Atajo de cambio de estado de ventana de letras</value>
</data> </data>
<data name="SettingsPageLyricsWindowToolTip.Content" xml:space="preserve">
<value>Ventana de letras</value>
</data>
<data name="SettingsPageMatchingThreshold.Description" xml:space="preserve"> <data name="SettingsPageMatchingThreshold.Description" xml:space="preserve">
<value>Ajustar este valor afectará a la búsqueda secuencial y a los resultados de la búsqueda de mejor coincidencia, pero no afectará a los resultados de búsqueda en la interfaz de búsqueda manual de letras</value> <value>Ajustar este valor afectará a la búsqueda secuencial y a los resultados de la búsqueda de mejor coincidencia, pero no afectará a los resultados de búsqueda en la interfaz de búsqueda manual de letras</value>
</data> </data>
@@ -1248,18 +1176,12 @@
<data name="SettingsPageMusicLib.Header" xml:space="preserve"> <data name="SettingsPageMusicLib.Header" xml:space="preserve">
<value>Biblioteca multimedia local</value> <value>Biblioteca multimedia local</value>
</data> </data>
<data name="SettingsPageMusicLibRealTimeWatch.Header" xml:space="preserve">
<value>Monitoreo de archivos en tiempo real</value>
</data>
<data name="SettingsPageNarrowMode.Text" xml:space="preserve"> <data name="SettingsPageNarrowMode.Text" xml:space="preserve">
<value>Modo Estrecho</value> <value>Modo Estrecho</value>
</data> </data>
<data name="SettingsPageNextSongHotKey.Header" xml:space="preserve"> <data name="SettingsPageNextSongHotKey.Header" xml:space="preserve">
<value>Atajo de pista siguiente</value> <value>Atajo de pista siguiente</value>
</data> </data>
<data name="SettingsPageNoBackdrop.Content" xml:space="preserve">
<value>Ninguno</value>
</data>
<data name="SettingsPageOctTree.Content" xml:space="preserve"> <data name="SettingsPageOctTree.Content" xml:space="preserve">
<value>Agresivo</value> <value>Agresivo</value>
</data> </data>
@@ -1287,9 +1209,6 @@
<data name="SettingsPagePathIncludingOthersInfo" xml:space="preserve"> <data name="SettingsPagePathIncludingOthersInfo" xml:space="preserve">
<value>Esta carpeta contiene carpetas ya agregadas, por favor elimínelas para agregar esta carpeta</value> <value>Esta carpeta contiene carpetas ya agregadas, por favor elimínelas para agregar esta carpeta</value>
</data> </data>
<data name="SettingsPagePathNotFound.Text" xml:space="preserve">
<value>No se puede encontrar esta ruta en su computadora</value>
</data>
<data name="SettingsPagePatrons.Text" xml:space="preserve"> <data name="SettingsPagePatrons.Text" xml:space="preserve">
<value>Patrocinio</value> <value>Patrocinio</value>
</data> </data>
@@ -1335,15 +1254,9 @@
<data name="SettingsPageRealtimeStatus.Text" xml:space="preserve"> <data name="SettingsPageRealtimeStatus.Text" xml:space="preserve">
<value>Estado en tiempo real</value> <value>Estado en tiempo real</value>
</data> </data>
<data name="SettingsPageRecord.Content" xml:space="preserve">
<value>Grabar</value>
</data>
<data name="SettingsPageRecordedWindowStatus.Text" xml:space="preserve"> <data name="SettingsPageRecordedWindowStatus.Text" xml:space="preserve">
<value>Estado de ventana grabado</value> <value>Estado de ventana grabado</value>
</data> </data>
<data name="SettingsPageReference.Header" xml:space="preserve">
<value>Referencias</value>
</data>
<data name="SettingsPageRefreshDropdown.Content" xml:space="preserve"> <data name="SettingsPageRefreshDropdown.Content" xml:space="preserve">
<value>Actualizar menú desplegable</value> <value>Actualizar menú desplegable</value>
</data> </data>
@@ -1362,9 +1275,6 @@
<data name="SettingsPageRight.Content" xml:space="preserve"> <data name="SettingsPageRight.Content" xml:space="preserve">
<value>Derecha</value> <value>Derecha</value>
</data> </data>
<data name="SettingsPageRomaji.Header" xml:space="preserve">
<value>Fonética japonesa</value>
</data>
<data name="SettingsPageScope.Header" xml:space="preserve"> <data name="SettingsPageScope.Header" xml:space="preserve">
<value>Alcance</value> <value>Alcance</value>
</data> </data>
@@ -1404,6 +1314,9 @@
<data name="SettingsPageSettingsManager.Header" xml:space="preserve"> <data name="SettingsPageSettingsManager.Header" xml:space="preserve">
<value>Gestor de configuración</value> <value>Gestor de configuración</value>
</data> </data>
<data name="SettingsPageSettingsPlayHistory.Header" xml:space="preserve">
<value>Historia del juego</value>
</data>
<data name="SettingsPageShareHub.Content" xml:space="preserve"> <data name="SettingsPageShareHub.Content" xml:space="preserve">
<value>Explorar Centro de recursos en línea</value> <value>Explorar Centro de recursos en línea</value>
</data> </data>
@@ -1431,18 +1344,12 @@
<data name="SettingsPageShowInSwitchers.Header" xml:space="preserve"> <data name="SettingsPageShowInSwitchers.Header" xml:space="preserve">
<value>Mostrar en entorno del sistema</value> <value>Mostrar en entorno del sistema</value>
</data> </data>
<data name="SettingsPageShowLayoutDragger.Header" xml:space="preserve">
<value>Mostrar divisor de diseño</value>
</data>
<data name="SettingsPageShowTitle.Header" xml:space="preserve"> <data name="SettingsPageShowTitle.Header" xml:space="preserve">
<value>Mostrar título</value> <value>Mostrar título</value>
</data> </data>
<data name="SettingsPageSlide.Content" xml:space="preserve"> <data name="SettingsPageSlide.Content" xml:space="preserve">
<value>Deslizar</value> <value>Deslizar</value>
</data> </data>
<data name="SettingsPageSliderPrefix.Text" xml:space="preserve">
<value>Valor actual: </value>
</data>
<data name="SettingsPageSnowFlakeLayer.Header" xml:space="preserve"> <data name="SettingsPageSnowFlakeLayer.Header" xml:space="preserve">
<value>Capa de copos de nieve</value> <value>Capa de copos de nieve</value>
</data> </data>
@@ -1485,6 +1392,9 @@
<data name="SettingsPageStartup.Text" xml:space="preserve"> <data name="SettingsPageStartup.Text" xml:space="preserve">
<value>Inicio</value> <value>Inicio</value>
</data> </data>
<data name="SettingsPageStats.Content" xml:space="preserve">
<value>Estadísticas</value>
</data>
<data name="SettingsPageStopTrackOnGalleryWindowClosed.Header" xml:space="preserve"> <data name="SettingsPageStopTrackOnGalleryWindowClosed.Header" xml:space="preserve">
<value>Detener reproducción al cerrar ventana de Galería de Música</value> <value>Detener reproducción al cerrar ventana de Galería de Música</value>
</data> </data>
@@ -1503,9 +1413,6 @@
<data name="SettingsPageTaskbarPlacement.Header" xml:space="preserve"> <data name="SettingsPageTaskbarPlacement.Header" xml:space="preserve">
<value>Posición de anclaje en barra de tareas</value> <value>Posición de anclaje en barra de tareas</value>
</data> </data>
<data name="SettingsPageThanksForPurchasing.Text" xml:space="preserve">
<value>Gracias por comprar BetterLyrics</value>
</data>
<data name="SettingsPageThanksList.Header" xml:space="preserve"> <data name="SettingsPageThanksList.Header" xml:space="preserve">
<value>Créditos</value> <value>Créditos</value>
</data> </data>
@@ -1524,12 +1431,6 @@
<data name="SettingsPageTitleBarAreaWhole.Content" xml:space="preserve"> <data name="SettingsPageTitleBarAreaWhole.Content" xml:space="preserve">
<value>Ventana completa</value> <value>Ventana completa</value>
</data> </data>
<data name="SettingsPageTitleBarType.Header" xml:space="preserve">
<value>Tamaño de la barra de título</value>
</data>
<data name="SettingsPageToggleHotKey.Header" xml:space="preserve">
<value>Atajo de Activar/Desactivar</value>
</data>
<data name="SettingsPageTranslatedText.Header" xml:space="preserve"> <data name="SettingsPageTranslatedText.Header" xml:space="preserve">
<value>Traducción</value> <value>Traducción</value>
</data> </data>
@@ -1539,9 +1440,6 @@
<data name="SettingsPageTranslationConfig.Header" xml:space="preserve"> <data name="SettingsPageTranslationConfig.Header" xml:space="preserve">
<value>Servicio LibreTranslate</value> <value>Servicio LibreTranslate</value>
</data> </data>
<data name="SettingsPageTranslationInfoLink.Text" xml:space="preserve">
<value>Visite https://github.com/LibreTranslate/LibreTranslate para tutorial de instalación y más información (Este software no está afiliado a este servicio)</value>
</data>
<data name="SettingsPageUserWhoPurchased.Text" xml:space="preserve"> <data name="SettingsPageUserWhoPurchased.Text" xml:space="preserve">
<value>Y usuarios que compraron BetterLyrics</value> <value>Y usuarios que compraron BetterLyrics</value>
</data> </data>
@@ -1554,9 +1452,6 @@
<data name="SettingsPageWidth.Header" xml:space="preserve"> <data name="SettingsPageWidth.Header" xml:space="preserve">
<value>Ancho</value> <value>Ancho</value>
</data> </data>
<data name="SettingsPageWindowBounds.Header" xml:space="preserve">
<value>Límites de la ventana</value>
</data>
<data name="SettingsPageWorkArea.Description" xml:space="preserve"> <data name="SettingsPageWorkArea.Description" xml:space="preserve">
<value>Como un área de trabajo separada, acoplada al borde superior/inferior de la pantalla</value> <value>Como un área de trabajo separada, acoplada al borde superior/inferior de la pantalla</value>
</data> </data>
@@ -1572,6 +1467,39 @@
<data name="StandardMode" xml:space="preserve"> <data name="StandardMode" xml:space="preserve">
<value>Modo Estándar</value> <value>Modo Estándar</value>
</data> </data>
<data name="StatsDashboardControlSources.Text" xml:space="preserve">
<value>Fuentes</value>
</data>
<data name="StatsDashboardControlThisMonth.Header" xml:space="preserve">
<value>Este mes</value>
</data>
<data name="StatsDashboardControlThisQuarter.Header" xml:space="preserve">
<value>Este trimestre</value>
</data>
<data name="StatsDashboardControlThisWeek.Header" xml:space="preserve">
<value>Esta semana</value>
</data>
<data name="StatsDashboardControlThisYear.Header" xml:space="preserve">
<value>Este año</value>
</data>
<data name="StatsDashboardControlToday.Header" xml:space="preserve">
<value>Hoy</value>
</data>
<data name="StatsDashboardControlTopArtists.Text" xml:space="preserve">
<value>Artistas principales</value>
</data>
<data name="StatsDashboardControlTopSongs.Text" xml:space="preserve">
<value>Top Tracks</value>
</data>
<data name="StatsDashboardControlTopSource.Text" xml:space="preserve">
<value>Fuente superior</value>
</data>
<data name="StatsDashboardControlTotalDuration.Text" xml:space="preserve">
<value>Duración total</value>
</data>
<data name="StatsDashboardControlTracksPlayed.Text" xml:space="preserve">
<value>Pistas reproducidas</value>
</data>
<data name="SystemTrayExit.Text" xml:space="preserve"> <data name="SystemTrayExit.Text" xml:space="preserve">
<value>Salir</value> <value>Salir</value>
</data> </data>
@@ -1581,9 +1509,6 @@
<data name="SystemTrayMusicGallery.Text" xml:space="preserve"> <data name="SystemTrayMusicGallery.Text" xml:space="preserve">
<value>Abrir Galería de Música</value> <value>Abrir Galería de Música</value>
</data> </data>
<data name="SystemTrayPageTitle" xml:space="preserve">
<value>Bandeja del sistema - BetterLyrics</value>
</data>
<data name="SystemTrayResetWindowPosition.Text" xml:space="preserve"> <data name="SystemTrayResetWindowPosition.Text" xml:space="preserve">
<value>Restablecer posición de ventana</value> <value>Restablecer posición de ventana</value>
</data> </data>

View File

@@ -129,21 +129,12 @@
<data name="AlbumArtSearchSMTCProvider" xml:space="preserve"> <data name="AlbumArtSearchSMTCProvider" xml:space="preserve">
<value>Lecteur de musique</value> <value>Lecteur de musique</value>
</data> </data>
<data name="AllLyricsSettingsControlPictureInPicture.Content" xml:space="preserve">
<value>Mode Image dans l'image</value>
</data>
<data name="AppSettingsControlGeneral.Text" xml:space="preserve"> <data name="AppSettingsControlGeneral.Text" xml:space="preserve">
<value>Fenêtre</value> <value>Fenêtre</value>
</data> </data>
<data name="ArtistsSplitHint.Text" xml:space="preserve"> <data name="ArtistsSplitHint.Text" xml:space="preserve">
<value>Lors de la saisie de plusieurs artistes, veuillez les séparer en utilisant l'un des délimiteurs suivants (ne pas mélanger)</value> <value>Lors de la saisie de plusieurs artistes, veuillez les séparer en utilisant l'un des délimiteurs suivants (ne pas mélanger)</value>
</data> </data>
<data name="BaseWindowHostInfoBarCheckBox.Content" xml:space="preserve">
<value>Ne plus afficher ce message</value>
</data>
<data name="BaseWindowMiniFlyoutItem.Text" xml:space="preserve">
<value>Mode Image dans l'image</value>
</data>
<data name="Cancel" xml:space="preserve"> <data name="Cancel" xml:space="preserve">
<value>Annuler</value> <value>Annuler</value>
</data> </data>
@@ -168,24 +159,45 @@
<data name="DockedMode" xml:space="preserve"> <data name="DockedMode" xml:space="preserve">
<value>Mode Ancré</value> <value>Mode Ancré</value>
</data> </data>
<data name="Error" xml:space="preserve">
<value>Erreur</value>
</data>
<data name="ExportSettingsSuccess" xml:space="preserve"> <data name="ExportSettingsSuccess" xml:space="preserve">
<value>Exportation réussie</value> <value>Exportation réussie</value>
</data> </data>
<data name="FailToStartLXMusicServer" xml:space="preserve"> <data name="FailToStartLXMusicServer" xml:space="preserve">
<value>Impossible de se connecter au serveur LX Music. Veuillez aller dans Paramètres - Source de lecture - LX Music - Serveur LX Music pour vérifier si le lien est correct</value> <value>Impossible de se connecter au serveur LX Music. Veuillez aller dans Paramètres - Source de lecture - LX Music - Serveur LX Music pour vérifier si le lien est correct</value>
</data> </data>
<data name="FileSystemServiceCleaningCache" xml:space="preserve">
<value>Nettoyage du cache...</value>
</data>
<data name="FileSystemServiceConnectFailed" xml:space="preserve">
<value>Échec de la connexion</value>
</data>
<data name="FileSystemServiceConnecting" xml:space="preserve">
<value>Connexion en cours...</value>
</data>
<data name="FileSystemServiceFetchingFileList" xml:space="preserve">
<value>Récupération de la liste des fichiers...</value>
</data>
<data name="FileSystemServiceParsing" xml:space="preserve">
<value>Parsing...</value>
</data>
<data name="FileSystemServicePrepareToClean" xml:space="preserve">
<value>Préparation du nettoyage du cache...</value>
</data>
<data name="FileSystemServiceReady" xml:space="preserve">
<value>Prêt</value>
</data>
<data name="FileSystemServiceRootDirectoryWarning" xml:space="preserve">
<value>Le chemin du répertoire racine a été détecté. Un index de disque complet peut contenir un grand nombre de fichiers non multimédias et faire durer l'analyse trop longtemps. Il est recommandé de spécifier un sous-répertoire spécifique.</value>
</data>
<data name="FileSystemServiceWaitingForScan" xml:space="preserve">
<value>En attente d'analyse...</value>
</data>
<data name="FullscreenMode" xml:space="preserve"> <data name="FullscreenMode" xml:space="preserve">
<value>Mode Plein écran</value> <value>Mode Plein écran</value>
</data> </data>
<data name="HostWindowClickThroughButton.Content" xml:space="preserve">
<value>Verrouiller</value>
</data>
<data name="HostWindowClickThroughFlyoutItem.Text" xml:space="preserve">
<value>Verrouiller</value>
</data>
<data name="HostWindowLockToolTip.Text" xml:space="preserve">
<value>Verrouiller</value>
</data>
<data name="HostWindowMusicGalleryButtonToolTip.Content" xml:space="preserve"> <data name="HostWindowMusicGalleryButtonToolTip.Content" xml:space="preserve">
<value>Galerie de musique</value> <value>Galerie de musique</value>
</data> </data>
@@ -204,9 +216,6 @@
<data name="Jyutping" xml:space="preserve"> <data name="Jyutping" xml:space="preserve">
<value>Jyutping (Cantonais)</value> <value>Jyutping (Cantonais)</value>
</data> </data>
<data name="KeepAtLeastOneStatusDefault" xml:space="preserve">
<value>Veuillez vous assurer qu'au moins un statut est défini par défaut</value>
</data>
<data name="LastFMAuthFailed" xml:space="preserve"> <data name="LastFMAuthFailed" xml:space="preserve">
<value>Échec de l'autorisation, veuillez réessayer</value> <value>Échec de l'autorisation, veuillez réessayer</value>
</data> </data>
@@ -270,18 +279,12 @@
<data name="LyricsPageSettings.Text" xml:space="preserve"> <data name="LyricsPageSettings.Text" xml:space="preserve">
<value>Paramètres</value> <value>Paramètres</value>
</data> </data>
<data name="LyricsPageTimelineOffsetButtonToolTip.Content" xml:space="preserve">
<value>Décalage temporel des paroles</value>
</data>
<data name="LyricsPageTranslationEnabled.Description" xml:space="preserve"> <data name="LyricsPageTranslationEnabled.Description" xml:space="preserve">
<value>Prioriser la lecture des traductions dans les paroles ; si aucune correspondance n'est trouvée, demander une traduction automatique au serveur LibreTranslate</value> <value>Prioriser la lecture des traductions dans les paroles ; si aucune correspondance n'est trouvée, demander une traduction automatique au serveur LibreTranslate</value>
</data> </data>
<data name="LyricsPageTranslationEnabled.Header" xml:space="preserve"> <data name="LyricsPageTranslationEnabled.Header" xml:space="preserve">
<value>Activer la traduction</value> <value>Activer la traduction</value>
</data> </data>
<data name="LyricsPageTranslationOnly.Header" xml:space="preserve">
<value>Afficher uniquement la traduction</value>
</data>
<data name="LyricsPageTranslationProviderPrefix.Header" xml:space="preserve"> <data name="LyricsPageTranslationProviderPrefix.Header" xml:space="preserve">
<value>Fournisseur de traduction</value> <value>Fournisseur de traduction</value>
</data> </data>
@@ -330,9 +333,6 @@
<data name="LyricsSearchControlSongInfoMapping.Text" xml:space="preserve"> <data name="LyricsSearchControlSongInfoMapping.Text" xml:space="preserve">
<value>Mappage des informations de la chanson</value> <value>Mappage des informations de la chanson</value>
</data> </data>
<data name="LyricsSearchControlTargetSearchProvider.Header" xml:space="preserve">
<value>Fournisseur de recherche de paroles cible</value>
</data>
<data name="LyricsSearchControlTitle.Header" xml:space="preserve"> <data name="LyricsSearchControlTitle.Header" xml:space="preserve">
<value>Titre</value> <value>Titre</value>
</data> </data>
@@ -351,15 +351,9 @@
<data name="LyricsSearchProviderTtmlFile" xml:space="preserve"> <data name="LyricsSearchProviderTtmlFile" xml:space="preserve">
<value>Fichier .TTML local</value> <value>Fichier .TTML local</value>
</data> </data>
<data name="LyricsWindowImmersiveButtonToolTip.Content" xml:space="preserve">
<value>Mode Immersif</value>
</data>
<data name="LyricsWindowSettingsControlLyricsWindowConfig.Text" xml:space="preserve"> <data name="LyricsWindowSettingsControlLyricsWindowConfig.Text" xml:space="preserve">
<value>Configuration</value> <value>Configuration</value>
</data> </data>
<data name="LyricsWindowSettingsControlLyricsWindowMode.Header" xml:space="preserve">
<value>Mode de fenêtre des paroles</value>
</data>
<data name="LyricsWindowSettingsControlSetDefault.Text" xml:space="preserve"> <data name="LyricsWindowSettingsControlSetDefault.Text" xml:space="preserve">
<value>Définir par défaut</value> <value>Définir par défaut</value>
</data> </data>
@@ -378,9 +372,6 @@
<data name="MainPageAlbumArtOnly.Content" xml:space="preserve"> <data name="MainPageAlbumArtOnly.Content" xml:space="preserve">
<value>Afficher uniquement la zone de la pochette</value> <value>Afficher uniquement la zone de la pochette</value>
</data> </data>
<data name="MainPageEnterImmersiveModeHint" xml:space="preserve">
<value>Survolez à nouveau pour afficher le bouton de basculement</value>
</data>
<data name="MainPageLyriscOnly.Content" xml:space="preserve"> <data name="MainPageLyriscOnly.Content" xml:space="preserve">
<value>Afficher uniquement les paroles</value> <value>Afficher uniquement les paroles</value>
</data> </data>
@@ -396,6 +387,18 @@
<data name="MainPageSplitView.Content" xml:space="preserve"> <data name="MainPageSplitView.Content" xml:space="preserve">
<value>Vue scindée</value> <value>Vue scindée</value>
</data> </data>
<data name="MediaSettingsControlLastSyncTime.Header" xml:space="preserve">
<value>Date de la dernière synchronisation</value>
</data>
<data name="MediaSettingsControlLocalFolder" xml:space="preserve">
<value>Dossier local</value>
</data>
<data name="MediaSettingsControlNameSetting.Header" xml:space="preserve">
<value>Nom</value>
</data>
<data name="MediaSettingsControlSyncNow.Content" xml:space="preserve">
<value>Synchroniser maintenant</value>
</data>
<data name="MusicGalleryPageAddToCustomList.Text" xml:space="preserve"> <data name="MusicGalleryPageAddToCustomList.Text" xml:space="preserve">
<value>Ajouter à la liste de lecture</value> <value>Ajouter à la liste de lecture</value>
</data> </data>
@@ -411,6 +414,12 @@
<data name="MusicGalleryPageAllSongs" xml:space="preserve"> <data name="MusicGalleryPageAllSongs" xml:space="preserve">
<value>Toute la musique</value> <value>Toute la musique</value>
</data> </data>
<data name="MusicGalleryPageDataSync.Message" xml:space="preserve">
<value>Synchronisation de la médiathèque en cours...</value>
</data>
<data name="MusicGalleryPageDataSyncError.Message" xml:space="preserve">
<value>Il y a un problème avec la synchronisation de la médiathèque</value>
</data>
<data name="MusicGalleryPageEmptyPlayingQueue.Text" xml:space="preserve"> <data name="MusicGalleryPageEmptyPlayingQueue.Text" xml:space="preserve">
<value>Vider la file d'attente</value> <value>Vider la file d'attente</value>
</data> </data>
@@ -420,9 +429,6 @@
<data name="MusicGalleryPageFileArtist.Header" xml:space="preserve"> <data name="MusicGalleryPageFileArtist.Header" xml:space="preserve">
<value>Artiste</value> <value>Artiste</value>
</data> </data>
<data name="MusicGalleryPageFileInfo.Text" xml:space="preserve">
<value>Info fichier</value>
</data>
<data name="MusicGalleryPageFileInfoBitDepth.Header" xml:space="preserve"> <data name="MusicGalleryPageFileInfoBitDepth.Header" xml:space="preserve">
<value>Profondeur de bits</value> <value>Profondeur de bits</value>
</data> </data>
@@ -456,15 +462,15 @@
<data name="MusicGalleryPageFileNotFound.Text" xml:space="preserve"> <data name="MusicGalleryPageFileNotFound.Text" xml:space="preserve">
<value>Aucune chanson trouvée dans la bibliothèque multimédia</value> <value>Aucune chanson trouvée dans la bibliothèque multimédia</value>
</data> </data>
<data name="MusicGalleryPageFolder.Text" xml:space="preserve">
<value>Dossiers</value>
</data>
<data name="MusicGalleryPageImportFromFile.Text" xml:space="preserve"> <data name="MusicGalleryPageImportFromFile.Text" xml:space="preserve">
<value>Importer depuis un fichier</value> <value>Importer depuis un fichier</value>
</data> </data>
<data name="MusicGalleryPageNewPlaylist.Text" xml:space="preserve"> <data name="MusicGalleryPageNewPlaylist.Text" xml:space="preserve">
<value>Créer une liste de lecture</value> <value>Créer une liste de lecture</value>
</data> </data>
<data name="MusicGalleryPagePlayAll.Content" xml:space="preserve">
<value>Tout lire</value>
</data>
<data name="MusicGalleryPagePlayingQueue.Text" xml:space="preserve"> <data name="MusicGalleryPagePlayingQueue.Text" xml:space="preserve">
<value>File d'attente de lecture</value> <value>File d'attente de lecture</value>
</data> </data>
@@ -472,7 +478,7 @@
<value>La file d'attente est vide</value> <value>La file d'attente est vide</value>
</data> </data>
<data name="MusicGalleryPagePlaylist.Text" xml:space="preserve"> <data name="MusicGalleryPagePlaylist.Text" xml:space="preserve">
<value>Liste de lecture</value> <value>Listes de lecture</value>
</data> </data>
<data name="MusicGalleryPageQueueLoop.Text" xml:space="preserve"> <data name="MusicGalleryPageQueueLoop.Text" xml:space="preserve">
<value>Boucle de liste</value> <value>Boucle de liste</value>
@@ -489,9 +495,6 @@
<data name="MusicGalleryPageScrollToPlayingItem.Text" xml:space="preserve"> <data name="MusicGalleryPageScrollToPlayingItem.Text" xml:space="preserve">
<value>Faire défiler jusqu'à l'élément en cours</value> <value>Faire défiler jusqu'à l'élément en cours</value>
</data> </data>
<data name="MusicGalleryPageSelectAll.Content" xml:space="preserve">
<value>Tout sélectionner</value>
</data>
<data name="MusicGalleryPageSingleLoop.Text" xml:space="preserve"> <data name="MusicGalleryPageSingleLoop.Text" xml:space="preserve">
<value>Boucle unique</value> <value>Boucle unique</value>
</data> </data>
@@ -513,20 +516,29 @@
<data name="MusicGalleryPageSortType.Text" xml:space="preserve"> <data name="MusicGalleryPageSortType.Text" xml:space="preserve">
<value>Type de tri</value> <value>Type de tri</value>
</data> </data>
<data name="MusicGalleryPageStarredPlaylist.Content" xml:space="preserve">
<value>Liste de lecture favorite</value>
</data>
<data name="MusicGalleryPageStopTrack.Text" xml:space="preserve"> <data name="MusicGalleryPageStopTrack.Text" xml:space="preserve">
<value>Arrêter</value> <value>Arrêter</value>
</data> </data>
<data name="MusicGalleryPageTitle" xml:space="preserve"> <data name="MusicGalleryPageTitle" xml:space="preserve">
<value>Galerie de musique - BetterLyrics</value> <value>Galerie de musique - BetterLyrics</value>
</data> </data>
<data name="MusicGalleryWindowDownButtonToolTip.Content" xml:space="preserve"> <data name="MusicSettingsControlAutoSyncInterval.Header" xml:space="preserve">
<value>Réduire</value> <value>Fréquence de synchronisation automatique</value>
</data> </data>
<data name="MusicGalleryWindowUpButtonToolTip.Content" xml:space="preserve"> <data name="MusicSettingsControlAutoSyncIntervalDisabled.Content" xml:space="preserve">
<value>Agrandir</value> <value>Jamais</value>
</data>
<data name="MusicSettingsControlAutoSyncIntervalEveryDay.Content" xml:space="preserve">
<value>Tous les jours</value>
</data>
<data name="MusicSettingsControlAutoSyncIntervalEveryFifteenMin.Content" xml:space="preserve">
<value>Toutes les 15 minutes</value>
</data>
<data name="MusicSettingsControlAutoSyncIntervalEveryHour.Content" xml:space="preserve">
<value>Toutes les heures</value>
</data>
<data name="MusicSettingsControlAutoSyncIntervalEverySixHrs.Content" xml:space="preserve">
<value>Toutes les 6 heures</value>
</data> </data>
<data name="NarrowMode" xml:space="preserve"> <data name="NarrowMode" xml:space="preserve">
<value>Mode Étroit</value> <value>Mode Étroit</value>
@@ -543,12 +555,27 @@
<data name="PrivacyPolicy.Content" xml:space="preserve"> <data name="PrivacyPolicy.Content" xml:space="preserve">
<value>Politique de confidentialité</value> <value>Politique de confidentialité</value>
</data> </data>
<data name="RemoteServerConfigControlBrowse.Content" xml:space="preserve">
<value>Parcourir</value>
</data>
<data name="RemoteServerConfigControlName.Header" xml:space="preserve">
<value>Nom</value>
</data>
<data name="RemoteServerConfigControlName.PlaceholderText" xml:space="preserve">
<value>Si vous laissez le champ vide, un nom par défaut sera automatiquement généré.</value>
</data>
<data name="RemoteServerConfigControlPassword.Header" xml:space="preserve"> <data name="RemoteServerConfigControlPassword.Header" xml:space="preserve">
<value>Mot de passe</value> <value>Mot de passe</value>
</data> </data>
<data name="RemoteServerConfigControlPath.Header" xml:space="preserve"> <data name="RemoteServerConfigControlPath.Header" xml:space="preserve">
<value>Chemin</value> <value>Chemin</value>
</data> </data>
<data name="RemoteServerConfigControlPathNotExisted" xml:space="preserve">
<value>Le chemin d'accès au dossier spécifié n'a pas été trouvé</value>
</data>
<data name="RemoteServerConfigControlPathRequired" xml:space="preserve">
<value>Le chemin d'accès est requis</value>
</data>
<data name="RemoteServerConfigControlPort.Header" xml:space="preserve"> <data name="RemoteServerConfigControlPort.Header" xml:space="preserve">
<value>Port</value> <value>Port</value>
</data> </data>
@@ -576,9 +603,6 @@
<data name="SetingsPageFeedback.Text" xml:space="preserve"> <data name="SetingsPageFeedback.Text" xml:space="preserve">
<value>Commentaires</value> <value>Commentaires</value>
</data> </data>
<data name="SetingsPageInstructions.Text" xml:space="preserve">
<value>Instructions</value>
</data>
<data name="SetingsPageSpecialThanks.Text" xml:space="preserve"> <data name="SetingsPageSpecialThanks.Text" xml:space="preserve">
<value>Remerciements spéciaux</value> <value>Remerciements spéciaux</value>
</data> </data>
@@ -606,9 +630,6 @@
<data name="SettingsPageAddFolderButton.Content" xml:space="preserve"> <data name="SettingsPageAddFolderButton.Content" xml:space="preserve">
<value>Ajouter</value> <value>Ajouter</value>
</data> </data>
<data name="SettingsPageAdvanced.Text" xml:space="preserve">
<value>Options avancées</value>
</data>
<data name="SettingsPageAlbum.Header" xml:space="preserve"> <data name="SettingsPageAlbum.Header" xml:space="preserve">
<value>Album</value> <value>Album</value>
</data> </data>
@@ -624,15 +645,9 @@
<data name="SettingsPageAlbumArtSearchProvidersConfig.Text" xml:space="preserve"> <data name="SettingsPageAlbumArtSearchProvidersConfig.Text" xml:space="preserve">
<value>Configurer les sources de pochette</value> <value>Configurer les sources de pochette</value>
</data> </data>
<data name="SettingsPageAlbumArtSize.Header" xml:space="preserve">
<value>Taille de la pochette</value>
</data>
<data name="SettingsPageAlbumEffect.Text" xml:space="preserve"> <data name="SettingsPageAlbumEffect.Text" xml:space="preserve">
<value>Effet de pochette d'album</value> <value>Effet de pochette d'album</value>
</data> </data>
<data name="SettingsPageAlbumLib.Content" xml:space="preserve">
<value>Sources de pochette</value>
</data>
<data name="SettingsPageAlbumRadius.Header" xml:space="preserve"> <data name="SettingsPageAlbumRadius.Header" xml:space="preserve">
<value>Rayon des coins</value> <value>Rayon des coins</value>
</data> </data>
@@ -663,12 +678,6 @@
<data name="SettingsPageAppAppearance.Text" xml:space="preserve"> <data name="SettingsPageAppAppearance.Text" xml:space="preserve">
<value>Apparence de l'application</value> <value>Apparence de l'application</value>
</data> </data>
<data name="SettingsPageAppBehavior.Text" xml:space="preserve">
<value>Comportement général</value>
</data>
<data name="SettingsPageApply.Content" xml:space="preserve">
<value>Appliquer</value>
</data>
<data name="SettingsPageArtist.Header" xml:space="preserve"> <data name="SettingsPageArtist.Header" xml:space="preserve">
<value>Artiste</value> <value>Artiste</value>
</data> </data>
@@ -687,23 +696,14 @@
<data name="SettingsPageAutoStart.Header" xml:space="preserve"> <data name="SettingsPageAutoStart.Header" xml:space="preserve">
<value>Démarrage automatique</value> <value>Démarrage automatique</value>
</data> </data>
<data name="SettingsPageAutoStartWindow.Header" xml:space="preserve">
<value>Au lancement de l'application</value>
</data>
<data name="SettingsPageBackdrop.Header" xml:space="preserve">
<value>Matériau d'arrière-plan des paroles</value>
</data>
<data name="SettingsPageBackgroundOverlay.Text" xml:space="preserve"> <data name="SettingsPageBackgroundOverlay.Text" xml:space="preserve">
<value>Arrière-plan des paroles</value> <value>Arrière-plan des paroles</value>
</data> </data>
<data name="SettingsPageBlurAmount.Header" xml:space="preserve"> <data name="SettingsPageBlurAmount.Header" xml:space="preserve">
<value>Quantité de flou</value> <value>Quantité de flou</value>
</data> </data>
<data name="SettingsPageBorderless.Header" xml:space="preserve">
<value>Fenêtre sans bordure</value>
</data>
<data name="SettingsPageCache.Description" xml:space="preserve"> <data name="SettingsPageCache.Description" xml:space="preserve">
<value>Comprend les fichiers journaux, le cache des paroles en ligne</value> <value>Inclut les fichiers journaux, le cache des paroles en ligne</value>
</data> </data>
<data name="SettingsPageCache.Header" xml:space="preserve"> <data name="SettingsPageCache.Header" xml:space="preserve">
<value>Cache</value> <value>Cache</value>
@@ -738,9 +738,6 @@
<data name="SettingsPageCollapseDropdown.Content" xml:space="preserve"> <data name="SettingsPageCollapseDropdown.Content" xml:space="preserve">
<value>Réduire le menu déroulant</value> <value>Réduire le menu déroulant</value>
</data> </data>
<data name="SettingsPageCompactTitleBar.Content" xml:space="preserve">
<value>Compact</value>
</data>
<data name="SettingsPageConfigName.Description" xml:space="preserve"> <data name="SettingsPageConfigName.Description" xml:space="preserve">
<value>Nommer les statuts de fenêtre enregistrés vous aide à mieux les distinguer</value> <value>Nommer les statuts de fenêtre enregistrés vous aide à mieux les distinguer</value>
</data> </data>
@@ -759,18 +756,12 @@
<data name="SettingsPageCrossfade.Content" xml:space="preserve"> <data name="SettingsPageCrossfade.Content" xml:space="preserve">
<value>Fondu enchaîné</value> <value>Fondu enchaîné</value>
</data> </data>
<data name="SettingsPageCurrentLyricsWindowStatus.Text" xml:space="preserve">
<value>État actuel de la fenêtre des paroles</value>
</data>
<data name="SettingsPageCutletDockerServer.Header" xml:space="preserve"> <data name="SettingsPageCutletDockerServer.Header" xml:space="preserve">
<value>Service de translittération cutlet-docker</value> <value>Service de translittération cutlet-docker</value>
</data> </data>
<data name="SettingsPageDark.Content" xml:space="preserve"> <data name="SettingsPageDark.Content" xml:space="preserve">
<value>Sombre</value> <value>Sombre</value>
</data> </data>
<data name="SettingsPageDebugOverlay.Header" xml:space="preserve">
<value>Afficher la superposition de débogage</value>
</data>
<data name="SettingsPageDelete.Text" xml:space="preserve"> <data name="SettingsPageDelete.Text" xml:space="preserve">
<value>Supprimer</value> <value>Supprimer</value>
</data> </data>
@@ -801,15 +792,9 @@
<data name="SettingsPageDockPlacementTop.Content" xml:space="preserve"> <data name="SettingsPageDockPlacementTop.Content" xml:space="preserve">
<value>Haut</value> <value>Haut</value>
</data> </data>
<data name="SettingsPageDockWindowHeight.Header" xml:space="preserve">
<value>Hauteur de la fenêtre</value>
</data>
<data name="SettingsPageDragArea.Header" xml:space="preserve"> <data name="SettingsPageDragArea.Header" xml:space="preserve">
<value>Zone déplaçable</value> <value>Zone déplaçable</value>
</data> </data>
<data name="SettingsPageEasingFuncType.Header" xml:space="preserve">
<value>Type de fonction d'assouplissement</value>
</data>
<data name="SettingsPageEasingTypeEaseInOutBack.Content" xml:space="preserve"> <data name="SettingsPageEasingTypeEaseInOutBack.Content" xml:space="preserve">
<value>Back Ease In-Out</value> <value>Back Ease In-Out</value>
</data> </data>
@@ -873,18 +858,15 @@
<data name="SettingsPageExitOnLyricsWindowClosed.Header" xml:space="preserve"> <data name="SettingsPageExitOnLyricsWindowClosed.Header" xml:space="preserve">
<value>Quitter l'app à la fermeture de la fenêtre des paroles</value> <value>Quitter l'app à la fermeture de la fenêtre des paroles</value>
</data> </data>
<data name="SettingsPageExportPlayHistoryButton.Content" xml:space="preserve">
<value>Exporter l'historique des jeux</value>
</data>
<data name="SettingsPageExportSettingsButton.Content" xml:space="preserve"> <data name="SettingsPageExportSettingsButton.Content" xml:space="preserve">
<value>Exporter les paramètres</value> <value>Exporter les paramètres</value>
</data> </data>
<data name="SettingsPageExtendedTitleBar.Content" xml:space="preserve">
<value>Étendu</value>
</data>
<data name="SettingsPageFan.Header" xml:space="preserve"> <data name="SettingsPageFan.Header" xml:space="preserve">
<value>Paroles en éventail</value> <value>Paroles en éventail</value>
</data> </data>
<data name="SettingsPageFAQ.Content" xml:space="preserve">
<value>FAQ</value>
</data>
<data name="SettingsPageFixedTimeStep.Header" xml:space="preserve"> <data name="SettingsPageFixedTimeStep.Header" xml:space="preserve">
<value>Rendu à pas de temps fixe</value> <value>Rendu à pas de temps fixe</value>
</data> </data>
@@ -921,9 +903,6 @@
<data name="SettingsPageHeight.Header" xml:space="preserve"> <data name="SettingsPageHeight.Header" xml:space="preserve">
<value>Hauteur</value> <value>Hauteur</value>
</data> </data>
<data name="SettingsPageHello.Text" xml:space="preserve">
<value>Bonjour</value>
</data>
<data name="SettingsPageHelpUsTranslate.Content" xml:space="preserve"> <data name="SettingsPageHelpUsTranslate.Content" xml:space="preserve">
<value>Aidez-nous à traduire cette application</value> <value>Aidez-nous à traduire cette application</value>
</data> </data>
@@ -954,9 +933,6 @@
<data name="SettingsPageJapanese.Header" xml:space="preserve"> <data name="SettingsPageJapanese.Header" xml:space="preserve">
<value>Phonétique japonaise</value> <value>Phonétique japonaise</value>
</data> </data>
<data name="SettingsPageJoinNowButton.Content" xml:space="preserve">
<value>Rejoindre maintenant</value>
</data>
<data name="SettingsPageJyutping.Content" xml:space="preserve"> <data name="SettingsPageJyutping.Content" xml:space="preserve">
<value>Jyutping (Cantonais)</value> <value>Jyutping (Cantonais)</value>
</data> </data>
@@ -1005,18 +981,12 @@
<data name="SettingsPageLight.Content" xml:space="preserve"> <data name="SettingsPageLight.Content" xml:space="preserve">
<value>Clair</value> <value>Clair</value>
</data> </data>
<data name="SettingsPageLinkedFile.Text" xml:space="preserve">
<value>Fichier local lié</value>
</data>
<data name="SettingsPageListenNewSession.Header" xml:space="preserve"> <data name="SettingsPageListenNewSession.Header" xml:space="preserve">
<value>Écouter les nouvelles sessions de lecture</value> <value>Écouter les nouvelles sessions de lecture</value>
</data> </data>
<data name="SettingsPageLocalFolder.Text" xml:space="preserve"> <data name="SettingsPageLocalFolder.Text" xml:space="preserve">
<value>Dossier local</value> <value>Dossier local</value>
</data> </data>
<data name="SettingsPageLog.Header" xml:space="preserve">
<value>Journalisation</value>
</data>
<data name="SettingsPageLongSyllableDuration.Header" xml:space="preserve"> <data name="SettingsPageLongSyllableDuration.Header" xml:space="preserve">
<value>Seuil de syllabe longue</value> <value>Seuil de syllabe longue</value>
</data> </data>
@@ -1071,15 +1041,6 @@
<data name="SettingsPageLyricsFgFontColor.Header" xml:space="preserve"> <data name="SettingsPageLyricsFgFontColor.Header" xml:space="preserve">
<value>Ligne actuelle</value> <value>Ligne actuelle</value>
</data> </data>
<data name="SettingsPageLyricsFgFontColorAdaptiveColored.Content" xml:space="preserve">
<value>Adapter à l'arrière-plan (Coloré)</value>
</data>
<data name="SettingsPageLyricsFgFontColorAdaptiveGrayed.Content" xml:space="preserve">
<value>Adapter à l'arrière-plan (Grismé)</value>
</data>
<data name="SettingsPageLyricsFgFontColorCustom.Content" xml:space="preserve">
<value>Personnalisé</value>
</data>
<data name="SettingsPageLyricsFloatAnimation.Header" xml:space="preserve"> <data name="SettingsPageLyricsFloatAnimation.Header" xml:space="preserve">
<value>Animation flottante</value> <value>Animation flottante</value>
</data> </data>
@@ -1107,27 +1068,12 @@
<data name="SettingsPageLyricsGlowEffect.Header" xml:space="preserve"> <data name="SettingsPageLyricsGlowEffect.Header" xml:space="preserve">
<value>Effet de lueur</value> <value>Effet de lueur</value>
</data> </data>
<data name="SettingsPageLyricsHighlight.Header" xml:space="preserve">
<value>Surlignage</value>
</data>
<data name="SettingsPageLyricsHighlightScope.Header" xml:space="preserve">
<value>Portée du surlignage du texte original</value>
</data>
<data name="SettingsPageLyricsLeft.Content" xml:space="preserve">
<value>Gauche</value>
</data>
<data name="SettingsPageLyricsLight.Content" xml:space="preserve"> <data name="SettingsPageLyricsLight.Content" xml:space="preserve">
<value>Léger</value> <value>Léger</value>
</data> </data>
<data name="SettingsPageLyricsLineFade.Header" xml:space="preserve">
<value>Fondu des bords de la zone de lecture</value>
</data>
<data name="SettingsPageLyricsLineSpacingFactor.Header" xml:space="preserve"> <data name="SettingsPageLyricsLineSpacingFactor.Header" xml:space="preserve">
<value>Interligne</value> <value>Interligne</value>
</data> </data>
<data name="SettingsPageLyricsLineSpacingFactorUnit.Text" xml:space="preserve">
<value> x Hauteur de ligne</value>
</data>
<data name="SettingsPageLyricsMedium.Content" xml:space="preserve"> <data name="SettingsPageLyricsMedium.Content" xml:space="preserve">
<value>Moyen</value> <value>Moyen</value>
</data> </data>
@@ -1170,9 +1116,6 @@
<data name="SettingsPageLyricsSemiLight.Content" xml:space="preserve"> <data name="SettingsPageLyricsSemiLight.Content" xml:space="preserve">
<value>Demi-Léger</value> <value>Demi-Léger</value>
</data> </data>
<data name="SettingsPageLyricsShadow.Header" xml:space="preserve">
<value>Ombre</value>
</data>
<data name="SettingsPageLyricsStyle.Text" xml:space="preserve"> <data name="SettingsPageLyricsStyle.Text" xml:space="preserve">
<value>Style des paroles</value> <value>Style des paroles</value>
</data> </data>
@@ -1188,30 +1131,15 @@
<data name="SettingsPageLyricsTimelineThreshold.Header" xml:space="preserve"> <data name="SettingsPageLyricsTimelineThreshold.Header" xml:space="preserve">
<value>Seuil de sync de la chronologie</value> <value>Seuil de sync de la chronologie</value>
</data> </data>
<data name="SettingsPageLyricsTranslationHighlight.Header" xml:space="preserve">
<value>Surlignage de la traduction</value>
</data>
<data name="SettingsPageLyricsTranslationSeparator.Header" xml:space="preserve">
<value>Séparateur Original-Traduction</value>
</data>
<data name="SettingsPageLyricsVerticalEdgeOpacity.Header" xml:space="preserve">
<value>Opacité des bords verticaux</value>
</data>
<data name="SettingsPageLyricsWindow.Text" xml:space="preserve"> <data name="SettingsPageLyricsWindow.Text" xml:space="preserve">
<value>Fenêtre des paroles</value> <value>Fenêtre des paroles</value>
</data> </data>
<data name="SettingsPageLyricsWindowManager.Text" xml:space="preserve">
<value>Gestionnaire de fenêtres de paroles</value>
</data>
<data name="SettingsPageLyricsWindowMgr.Content" xml:space="preserve"> <data name="SettingsPageLyricsWindowMgr.Content" xml:space="preserve">
<value>Gestionnaire de fenêtres de paroles</value> <value>Gestionnaire de fenêtres de paroles</value>
</data> </data>
<data name="SettingsPageLyricsWindowSwitchHotKey.Header" xml:space="preserve"> <data name="SettingsPageLyricsWindowSwitchHotKey.Header" xml:space="preserve">
<value>Raccourci changement état fenêtre paroles</value> <value>Raccourci changement état fenêtre paroles</value>
</data> </data>
<data name="SettingsPageLyricsWindowToolTip.Content" xml:space="preserve">
<value>Fenêtre des paroles</value>
</data>
<data name="SettingsPageMatchingThreshold.Description" xml:space="preserve"> <data name="SettingsPageMatchingThreshold.Description" xml:space="preserve">
<value>L'ajustement de cette valeur affectera les résultats de la recherche séquentielle et de la meilleure correspondance, mais n'affectera pas les résultats de la recherche manuelle</value> <value>L'ajustement de cette valeur affectera les résultats de la recherche séquentielle et de la meilleure correspondance, mais n'affectera pas les résultats de la recherche manuelle</value>
</data> </data>
@@ -1248,18 +1176,12 @@
<data name="SettingsPageMusicLib.Header" xml:space="preserve"> <data name="SettingsPageMusicLib.Header" xml:space="preserve">
<value>Bibliothèque multimédia locale</value> <value>Bibliothèque multimédia locale</value>
</data> </data>
<data name="SettingsPageMusicLibRealTimeWatch.Header" xml:space="preserve">
<value>Surveillance des fichiers en temps réel</value>
</data>
<data name="SettingsPageNarrowMode.Text" xml:space="preserve"> <data name="SettingsPageNarrowMode.Text" xml:space="preserve">
<value>Mode Étroit</value> <value>Mode Étroit</value>
</data> </data>
<data name="SettingsPageNextSongHotKey.Header" xml:space="preserve"> <data name="SettingsPageNextSongHotKey.Header" xml:space="preserve">
<value>Raccourci piste suivante</value> <value>Raccourci piste suivante</value>
</data> </data>
<data name="SettingsPageNoBackdrop.Content" xml:space="preserve">
<value>Aucun</value>
</data>
<data name="SettingsPageOctTree.Content" xml:space="preserve"> <data name="SettingsPageOctTree.Content" xml:space="preserve">
<value>Agressif</value> <value>Agressif</value>
</data> </data>
@@ -1287,9 +1209,6 @@
<data name="SettingsPagePathIncludingOthersInfo" xml:space="preserve"> <data name="SettingsPagePathIncludingOthersInfo" xml:space="preserve">
<value>Ce dossier contient des dossiers déjà ajoutés, veuillez les supprimer pour ajouter celui-ci</value> <value>Ce dossier contient des dossiers déjà ajoutés, veuillez les supprimer pour ajouter celui-ci</value>
</data> </data>
<data name="SettingsPagePathNotFound.Text" xml:space="preserve">
<value>Impossible de trouver ce chemin sur votre ordinateur</value>
</data>
<data name="SettingsPagePatrons.Text" xml:space="preserve"> <data name="SettingsPagePatrons.Text" xml:space="preserve">
<value>Parrainage</value> <value>Parrainage</value>
</data> </data>
@@ -1335,15 +1254,9 @@
<data name="SettingsPageRealtimeStatus.Text" xml:space="preserve"> <data name="SettingsPageRealtimeStatus.Text" xml:space="preserve">
<value>Statut en temps réel</value> <value>Statut en temps réel</value>
</data> </data>
<data name="SettingsPageRecord.Content" xml:space="preserve">
<value>Enregistrer</value>
</data>
<data name="SettingsPageRecordedWindowStatus.Text" xml:space="preserve"> <data name="SettingsPageRecordedWindowStatus.Text" xml:space="preserve">
<value>État de la fenêtre enregistré</value> <value>État de la fenêtre enregistré</value>
</data> </data>
<data name="SettingsPageReference.Header" xml:space="preserve">
<value>Références</value>
</data>
<data name="SettingsPageRefreshDropdown.Content" xml:space="preserve"> <data name="SettingsPageRefreshDropdown.Content" xml:space="preserve">
<value>Actualiser la liste déroulante</value> <value>Actualiser la liste déroulante</value>
</data> </data>
@@ -1362,9 +1275,6 @@
<data name="SettingsPageRight.Content" xml:space="preserve"> <data name="SettingsPageRight.Content" xml:space="preserve">
<value>Droite</value> <value>Droite</value>
</data> </data>
<data name="SettingsPageRomaji.Header" xml:space="preserve">
<value>Phonétique japonaise</value>
</data>
<data name="SettingsPageScope.Header" xml:space="preserve"> <data name="SettingsPageScope.Header" xml:space="preserve">
<value>Portée</value> <value>Portée</value>
</data> </data>
@@ -1404,6 +1314,9 @@
<data name="SettingsPageSettingsManager.Header" xml:space="preserve"> <data name="SettingsPageSettingsManager.Header" xml:space="preserve">
<value>Gestionnaire de paramètres</value> <value>Gestionnaire de paramètres</value>
</data> </data>
<data name="SettingsPageSettingsPlayHistory.Header" xml:space="preserve">
<value>Histoire du jeu</value>
</data>
<data name="SettingsPageShareHub.Content" xml:space="preserve"> <data name="SettingsPageShareHub.Content" xml:space="preserve">
<value>Parcourir le Hub de partage en ligne</value> <value>Parcourir le Hub de partage en ligne</value>
</data> </data>
@@ -1431,18 +1344,12 @@
<data name="SettingsPageShowInSwitchers.Header" xml:space="preserve"> <data name="SettingsPageShowInSwitchers.Header" xml:space="preserve">
<value>Afficher dans l'environnement système</value> <value>Afficher dans l'environnement système</value>
</data> </data>
<data name="SettingsPageShowLayoutDragger.Header" xml:space="preserve">
<value>Afficher le séparateur de mise en page</value>
</data>
<data name="SettingsPageShowTitle.Header" xml:space="preserve"> <data name="SettingsPageShowTitle.Header" xml:space="preserve">
<value>Afficher le titre</value> <value>Afficher le titre</value>
</data> </data>
<data name="SettingsPageSlide.Content" xml:space="preserve"> <data name="SettingsPageSlide.Content" xml:space="preserve">
<value>Glisser</value> <value>Glisser</value>
</data> </data>
<data name="SettingsPageSliderPrefix.Text" xml:space="preserve">
<value>Valeur actuelle : </value>
</data>
<data name="SettingsPageSnowFlakeLayer.Header" xml:space="preserve"> <data name="SettingsPageSnowFlakeLayer.Header" xml:space="preserve">
<value>Couche de flocons de neige</value> <value>Couche de flocons de neige</value>
</data> </data>
@@ -1485,6 +1392,9 @@
<data name="SettingsPageStartup.Text" xml:space="preserve"> <data name="SettingsPageStartup.Text" xml:space="preserve">
<value>Démarrage</value> <value>Démarrage</value>
</data> </data>
<data name="SettingsPageStats.Content" xml:space="preserve">
<value>Statistiques</value>
</data>
<data name="SettingsPageStopTrackOnGalleryWindowClosed.Header" xml:space="preserve"> <data name="SettingsPageStopTrackOnGalleryWindowClosed.Header" xml:space="preserve">
<value>Arrêter la lecture à la fermeture de la Galerie</value> <value>Arrêter la lecture à la fermeture de la Galerie</value>
</data> </data>
@@ -1503,9 +1413,6 @@
<data name="SettingsPageTaskbarPlacement.Header" xml:space="preserve"> <data name="SettingsPageTaskbarPlacement.Header" xml:space="preserve">
<value>Position d'épinglage barre des tâches</value> <value>Position d'épinglage barre des tâches</value>
</data> </data>
<data name="SettingsPageThanksForPurchasing.Text" xml:space="preserve">
<value>Merci d'avoir acheté BetterLyrics</value>
</data>
<data name="SettingsPageThanksList.Header" xml:space="preserve"> <data name="SettingsPageThanksList.Header" xml:space="preserve">
<value>Crédits</value> <value>Crédits</value>
</data> </data>
@@ -1524,12 +1431,6 @@
<data name="SettingsPageTitleBarAreaWhole.Content" xml:space="preserve"> <data name="SettingsPageTitleBarAreaWhole.Content" xml:space="preserve">
<value>Fenêtre entière</value> <value>Fenêtre entière</value>
</data> </data>
<data name="SettingsPageTitleBarType.Header" xml:space="preserve">
<value>Taille de la barre de titre</value>
</data>
<data name="SettingsPageToggleHotKey.Header" xml:space="preserve">
<value>Raccourci Activer/Désactiver</value>
</data>
<data name="SettingsPageTranslatedText.Header" xml:space="preserve"> <data name="SettingsPageTranslatedText.Header" xml:space="preserve">
<value>Traduction</value> <value>Traduction</value>
</data> </data>
@@ -1539,9 +1440,6 @@
<data name="SettingsPageTranslationConfig.Header" xml:space="preserve"> <data name="SettingsPageTranslationConfig.Header" xml:space="preserve">
<value>Service LibreTranslate</value> <value>Service LibreTranslate</value>
</data> </data>
<data name="SettingsPageTranslationInfoLink.Text" xml:space="preserve">
<value>Visitez https://github.com/LibreTranslate/LibreTranslate pour le tutoriel d'installation et plus d'infos (Ce logiciel n'est pas affilié à ce service)</value>
</data>
<data name="SettingsPageUserWhoPurchased.Text" xml:space="preserve"> <data name="SettingsPageUserWhoPurchased.Text" xml:space="preserve">
<value>Et les utilisateurs ayant acheté BetterLyrics</value> <value>Et les utilisateurs ayant acheté BetterLyrics</value>
</data> </data>
@@ -1554,9 +1452,6 @@
<data name="SettingsPageWidth.Header" xml:space="preserve"> <data name="SettingsPageWidth.Header" xml:space="preserve">
<value>Largeur</value> <value>Largeur</value>
</data> </data>
<data name="SettingsPageWindowBounds.Header" xml:space="preserve">
<value>Limites de la fenêtre</value>
</data>
<data name="SettingsPageWorkArea.Description" xml:space="preserve"> <data name="SettingsPageWorkArea.Description" xml:space="preserve">
<value>Comme un espace de travail séparé, ancré au bord supérieur/inférieur de l'écran</value> <value>Comme un espace de travail séparé, ancré au bord supérieur/inférieur de l'écran</value>
</data> </data>
@@ -1572,6 +1467,39 @@
<data name="StandardMode" xml:space="preserve"> <data name="StandardMode" xml:space="preserve">
<value>Mode Standard</value> <value>Mode Standard</value>
</data> </data>
<data name="StatsDashboardControlSources.Text" xml:space="preserve">
<value>Sources d'information</value>
</data>
<data name="StatsDashboardControlThisMonth.Header" xml:space="preserve">
<value>Ce mois-ci</value>
</data>
<data name="StatsDashboardControlThisQuarter.Header" xml:space="preserve">
<value>Ce trimestre</value>
</data>
<data name="StatsDashboardControlThisWeek.Header" xml:space="preserve">
<value>Cette semaine</value>
</data>
<data name="StatsDashboardControlThisYear.Header" xml:space="preserve">
<value>Cette année</value>
</data>
<data name="StatsDashboardControlToday.Header" xml:space="preserve">
<value>Aujourd'hui</value>
</data>
<data name="StatsDashboardControlTopArtists.Text" xml:space="preserve">
<value>Artistes de haut niveau</value>
</data>
<data name="StatsDashboardControlTopSongs.Text" xml:space="preserve">
<value>Top Tracks</value>
</data>
<data name="StatsDashboardControlTopSource.Text" xml:space="preserve">
<value>Source supérieure</value>
</data>
<data name="StatsDashboardControlTotalDuration.Text" xml:space="preserve">
<value>Durée totale</value>
</data>
<data name="StatsDashboardControlTracksPlayed.Text" xml:space="preserve">
<value>Pistes jouées</value>
</data>
<data name="SystemTrayExit.Text" xml:space="preserve"> <data name="SystemTrayExit.Text" xml:space="preserve">
<value>Quitter</value> <value>Quitter</value>
</data> </data>
@@ -1581,9 +1509,6 @@
<data name="SystemTrayMusicGallery.Text" xml:space="preserve"> <data name="SystemTrayMusicGallery.Text" xml:space="preserve">
<value>Ouvrir la Galerie de musique</value> <value>Ouvrir la Galerie de musique</value>
</data> </data>
<data name="SystemTrayPageTitle" xml:space="preserve">
<value>Zone de notification - BetterLyrics</value>
</data>
<data name="SystemTrayResetWindowPosition.Text" xml:space="preserve"> <data name="SystemTrayResetWindowPosition.Text" xml:space="preserve">
<value>Réinitialiser la position de la fenêtre</value> <value>Réinitialiser la position de la fenêtre</value>
</data> </data>

View File

@@ -129,21 +129,12 @@
<data name="AlbumArtSearchSMTCProvider" xml:space="preserve"> <data name="AlbumArtSearchSMTCProvider" xml:space="preserve">
<value>म्यूजिक प्लेयर</value> <value>म्यूजिक प्लेयर</value>
</data> </data>
<data name="AllLyricsSettingsControlPictureInPicture.Content" xml:space="preserve">
<value>पिक्चर-इन-पिक्चर मोड</value>
</data>
<data name="AppSettingsControlGeneral.Text" xml:space="preserve"> <data name="AppSettingsControlGeneral.Text" xml:space="preserve">
<value>विंडो</value> <value>विंडो</value>
</data> </data>
<data name="ArtistsSplitHint.Text" xml:space="preserve"> <data name="ArtistsSplitHint.Text" xml:space="preserve">
<value>कई कलाकारों को इनपुट करते समय, कृपया उन्हें अलग करने के लिए निम्नलिखित विभाजकों में से किसी एक का उपयोग करें (कृपया मिश्रण न करें)</value> <value>कई कलाकारों को इनपुट करते समय, कृपया उन्हें अलग करने के लिए निम्नलिखित विभाजकों में से किसी एक का उपयोग करें (कृपया मिश्रण न करें)</value>
</data> </data>
<data name="BaseWindowHostInfoBarCheckBox.Content" xml:space="preserve">
<value>यह संदेश दोबारा न दिखाएं</value>
</data>
<data name="BaseWindowMiniFlyoutItem.Text" xml:space="preserve">
<value>पिक्चर-इन-पिक्चर मोड</value>
</data>
<data name="Cancel" xml:space="preserve"> <data name="Cancel" xml:space="preserve">
<value>रद्द करें</value> <value>रद्द करें</value>
</data> </data>
@@ -168,24 +159,45 @@
<data name="DockedMode" xml:space="preserve"> <data name="DockedMode" xml:space="preserve">
<value>डॉक्ड मोड</value> <value>डॉक्ड मोड</value>
</data> </data>
<data name="Error" xml:space="preserve">
<value>त्रुटि</value>
</data>
<data name="ExportSettingsSuccess" xml:space="preserve"> <data name="ExportSettingsSuccess" xml:space="preserve">
<value>निर्यात सफल रहा</value> <value>निर्यात सफल रहा</value>
</data> </data>
<data name="FailToStartLXMusicServer" xml:space="preserve"> <data name="FailToStartLXMusicServer" xml:space="preserve">
<value>LX Music सर्वर से कनेक्ट नहीं हो सकता, कृपया सेटिंग्स - प्लेबैक स्रोत - LX Music - LX Music सर्वर पर जाएं और जांचें कि लिंक सही तरीके से दर्ज किया गया है या नहीं</value> <value>LX Music सर्वर से कनेक्ट नहीं हो सकता, कृपया सेटिंग्स - प्लेबैक स्रोत - LX Music - LX Music सर्वर पर जाएं और जांचें कि लिंक सही तरीके से दर्ज किया गया है या नहीं</value>
</data> </data>
<data name="FileSystemServiceCleaningCache" xml:space="preserve">
<value>कैश साफ़ हो रहा है...</value>
</data>
<data name="FileSystemServiceConnectFailed" xml:space="preserve">
<value>कनेक्शन विफल रहा</value>
</data>
<data name="FileSystemServiceConnecting" xml:space="preserve">
<value>कनेक्टिंग ...</value>
</data>
<data name="FileSystemServiceFetchingFileList" xml:space="preserve">
<value>फ़ाइल लिस्ट लाई जा रही है...</value>
</data>
<data name="FileSystemServiceParsing" xml:space="preserve">
<value>पार्सिंग...</value>
</data>
<data name="FileSystemServicePrepareToClean" xml:space="preserve">
<value>कैश साफ़ करने की तैयारी...</value>
</data>
<data name="FileSystemServiceReady" xml:space="preserve">
<value>तैयार</value>
</data>
<data name="FileSystemServiceRootDirectoryWarning" xml:space="preserve">
<value>रूट डायरेक्टरी पाथ का पता चल गया है। एक फुल डिस्क इंडेक्स में बड़ी संख्या में नॉन-मीडिया फ़ाइलें हो सकती हैं और स्कैन में बहुत ज़्यादा समय लग सकता है। एक खास सबडायरेक्टरी बताने की सलाह दी जाती है।</value>
</data>
<data name="FileSystemServiceWaitingForScan" xml:space="preserve">
<value>स्कैन करने की तैयारी...</value>
</data>
<data name="FullscreenMode" xml:space="preserve"> <data name="FullscreenMode" xml:space="preserve">
<value>फुलस्क्रीन मोड</value> <value>फुलस्क्रीन मोड</value>
</data> </data>
<data name="HostWindowClickThroughButton.Content" xml:space="preserve">
<value>लॉक</value>
</data>
<data name="HostWindowClickThroughFlyoutItem.Text" xml:space="preserve">
<value>लॉक</value>
</data>
<data name="HostWindowLockToolTip.Text" xml:space="preserve">
<value>लॉक</value>
</data>
<data name="HostWindowMusicGalleryButtonToolTip.Content" xml:space="preserve"> <data name="HostWindowMusicGalleryButtonToolTip.Content" xml:space="preserve">
<value>संगीत गैलरी</value> <value>संगीत गैलरी</value>
</data> </data>
@@ -204,9 +216,6 @@
<data name="Jyutping" xml:space="preserve"> <data name="Jyutping" xml:space="preserve">
<value>ज्यूतपिंग (केंटोनीज़)</value> <value>ज्यूतपिंग (केंटोनीज़)</value>
</data> </data>
<data name="KeepAtLeastOneStatusDefault" xml:space="preserve">
<value>कृपया सुनिश्चित करें कि कम से कम एक स्थिति डिफ़ॉल्ट के रूप में सेट है</value>
</data>
<data name="LastFMAuthFailed" xml:space="preserve"> <data name="LastFMAuthFailed" xml:space="preserve">
<value>प्राधिकरण विफल, कृपया पुनः प्रयास करें</value> <value>प्राधिकरण विफल, कृपया पुनः प्रयास करें</value>
</data> </data>
@@ -270,18 +279,12 @@
<data name="LyricsPageSettings.Text" xml:space="preserve"> <data name="LyricsPageSettings.Text" xml:space="preserve">
<value>सेटिंग्स</value> <value>सेटिंग्स</value>
</data> </data>
<data name="LyricsPageTimelineOffsetButtonToolTip.Content" xml:space="preserve">
<value>बोल समयरेखा ऑफसेट</value>
</data>
<data name="LyricsPageTranslationEnabled.Description" xml:space="preserve"> <data name="LyricsPageTranslationEnabled.Description" xml:space="preserve">
<value>बोल के भीतर अनुवाद पढ़ने को प्राथमिकता दी जाएगी, यदि कोई मेल नहीं मिलता है तो LibreTranslate सर्वर से मशीनी अनुवाद का अनुरोध किया जाएगा</value> <value>बोल के भीतर अनुवाद पढ़ने को प्राथमिकता दी जाएगी, यदि कोई मेल नहीं मिलता है तो LibreTranslate सर्वर से मशीनी अनुवाद का अनुरोध किया जाएगा</value>
</data> </data>
<data name="LyricsPageTranslationEnabled.Header" xml:space="preserve"> <data name="LyricsPageTranslationEnabled.Header" xml:space="preserve">
<value>अनुवाद सक्षम करें</value> <value>अनुवाद सक्षम करें</value>
</data> </data>
<data name="LyricsPageTranslationOnly.Header" xml:space="preserve">
<value>केवल अनुवाद दिखाएं</value>
</data>
<data name="LyricsPageTranslationProviderPrefix.Header" xml:space="preserve"> <data name="LyricsPageTranslationProviderPrefix.Header" xml:space="preserve">
<value>अनुवाद प्रदाता</value> <value>अनुवाद प्रदाता</value>
</data> </data>
@@ -330,9 +333,6 @@
<data name="LyricsSearchControlSongInfoMapping.Text" xml:space="preserve"> <data name="LyricsSearchControlSongInfoMapping.Text" xml:space="preserve">
<value>गीत सूचना मैपिंग</value> <value>गीत सूचना मैपिंग</value>
</data> </data>
<data name="LyricsSearchControlTargetSearchProvider.Header" xml:space="preserve">
<value>लक्ष्य बोल खोज प्रदाता</value>
</data>
<data name="LyricsSearchControlTitle.Header" xml:space="preserve"> <data name="LyricsSearchControlTitle.Header" xml:space="preserve">
<value>शीर्षक</value> <value>शीर्षक</value>
</data> </data>
@@ -351,15 +351,9 @@
<data name="LyricsSearchProviderTtmlFile" xml:space="preserve"> <data name="LyricsSearchProviderTtmlFile" xml:space="preserve">
<value>स्थानीय .TTML फ़ाइल</value> <value>स्थानीय .TTML फ़ाइल</value>
</data> </data>
<data name="LyricsWindowImmersiveButtonToolTip.Content" xml:space="preserve">
<value>इमर्सिव मोड</value>
</data>
<data name="LyricsWindowSettingsControlLyricsWindowConfig.Text" xml:space="preserve"> <data name="LyricsWindowSettingsControlLyricsWindowConfig.Text" xml:space="preserve">
<value>कॉन्फ़िगरेशन</value> <value>कॉन्फ़िगरेशन</value>
</data> </data>
<data name="LyricsWindowSettingsControlLyricsWindowMode.Header" xml:space="preserve">
<value>बोल विंडो मोड</value>
</data>
<data name="LyricsWindowSettingsControlSetDefault.Text" xml:space="preserve"> <data name="LyricsWindowSettingsControlSetDefault.Text" xml:space="preserve">
<value>डिफ़ॉल्ट के रूप में सेट करें</value> <value>डिफ़ॉल्ट के रूप में सेट करें</value>
</data> </data>
@@ -378,9 +372,6 @@
<data name="MainPageAlbumArtOnly.Content" xml:space="preserve"> <data name="MainPageAlbumArtOnly.Content" xml:space="preserve">
<value>केवल एल्बम आर्ट क्षेत्र दिखाएं</value> <value>केवल एल्बम आर्ट क्षेत्र दिखाएं</value>
</data> </data>
<data name="MainPageEnterImmersiveModeHint" xml:space="preserve">
<value>स्विच बटन दिखाने के लिए फिर से होवर करें</value>
</data>
<data name="MainPageLyriscOnly.Content" xml:space="preserve"> <data name="MainPageLyriscOnly.Content" xml:space="preserve">
<value>केवल बोल दिखाएं</value> <value>केवल बोल दिखाएं</value>
</data> </data>
@@ -396,6 +387,18 @@
<data name="MainPageSplitView.Content" xml:space="preserve"> <data name="MainPageSplitView.Content" xml:space="preserve">
<value>विभाजित दृश्य</value> <value>विभाजित दृश्य</value>
</data> </data>
<data name="MediaSettingsControlLastSyncTime.Header" xml:space="preserve">
<value>अंतिम सिंक समय</value>
</data>
<data name="MediaSettingsControlLocalFolder" xml:space="preserve">
<value>स्थानीय फोल्डर</value>
</data>
<data name="MediaSettingsControlNameSetting.Header" xml:space="preserve">
<value>नाम</value>
</data>
<data name="MediaSettingsControlSyncNow.Content" xml:space="preserve">
<value>अभी सिंक्रनाइज़ करें</value>
</data>
<data name="MusicGalleryPageAddToCustomList.Text" xml:space="preserve"> <data name="MusicGalleryPageAddToCustomList.Text" xml:space="preserve">
<value>प्लेलिस्ट में जोड़ें</value> <value>प्लेलिस्ट में जोड़ें</value>
</data> </data>
@@ -406,11 +409,17 @@
<value>अगला आइटम</value> <value>अगला आइटम</value>
</data> </data>
<data name="MusicGalleryPageAddToPlayingQueue.Text" xml:space="preserve"> <data name="MusicGalleryPageAddToPlayingQueue.Text" xml:space="preserve">
<value>प्लेइंग कतार में जोड़ें</value> <value>प्लेइंग क्यू में जोड़ें</value>
</data> </data>
<data name="MusicGalleryPageAllSongs" xml:space="preserve"> <data name="MusicGalleryPageAllSongs" xml:space="preserve">
<value>सभी गाने</value> <value>सभी गाने</value>
</data> </data>
<data name="MusicGalleryPageDataSync.Message" xml:space="preserve">
<value>मीडिया लाइब्रेरी सिंक चल रहा है...</value>
</data>
<data name="MusicGalleryPageDataSyncError.Message" xml:space="preserve">
<value>मीडिया लाइब्रेरी सिंक में कोई समस्या है</value>
</data>
<data name="MusicGalleryPageEmptyPlayingQueue.Text" xml:space="preserve"> <data name="MusicGalleryPageEmptyPlayingQueue.Text" xml:space="preserve">
<value>प्लेइंग कतार साफ़ करें</value> <value>प्लेइंग कतार साफ़ करें</value>
</data> </data>
@@ -420,9 +429,6 @@
<data name="MusicGalleryPageFileArtist.Header" xml:space="preserve"> <data name="MusicGalleryPageFileArtist.Header" xml:space="preserve">
<value>कलाकार</value> <value>कलाकार</value>
</data> </data>
<data name="MusicGalleryPageFileInfo.Text" xml:space="preserve">
<value>फ़ाइल की जानकारी</value>
</data>
<data name="MusicGalleryPageFileInfoBitDepth.Header" xml:space="preserve"> <data name="MusicGalleryPageFileInfoBitDepth.Header" xml:space="preserve">
<value>बिट गहराई</value> <value>बिट गहराई</value>
</data> </data>
@@ -456,14 +462,14 @@
<data name="MusicGalleryPageFileNotFound.Text" xml:space="preserve"> <data name="MusicGalleryPageFileNotFound.Text" xml:space="preserve">
<value>मीडिया लाइब्रेरी में कोई गाना नहीं मिला</value> <value>मीडिया लाइब्रेरी में कोई गाना नहीं मिला</value>
</data> </data>
<data name="MusicGalleryPageFolder.Text" xml:space="preserve">
<value>फ़ोल्डर्स</value>
</data>
<data name="MusicGalleryPageImportFromFile.Text" xml:space="preserve"> <data name="MusicGalleryPageImportFromFile.Text" xml:space="preserve">
<value>फ़ाइल से आयात करें</value> <value>फ़ाइल से आयात करें</value>
</data> </data>
<data name="MusicGalleryPageNewPlaylist.Text" xml:space="preserve"> <data name="MusicGalleryPageNewPlaylist.Text" xml:space="preserve">
<value>प्लेलिस्ट बनां</value> <value>प्लेलिस्ट बनायें</value>
</data>
<data name="MusicGalleryPagePlayAll.Content" xml:space="preserve">
<value>सभी चलाएं</value>
</data> </data>
<data name="MusicGalleryPagePlayingQueue.Text" xml:space="preserve"> <data name="MusicGalleryPagePlayingQueue.Text" xml:space="preserve">
<value>प्लेइंग कतार</value> <value>प्लेइंग कतार</value>
@@ -489,9 +495,6 @@
<data name="MusicGalleryPageScrollToPlayingItem.Text" xml:space="preserve"> <data name="MusicGalleryPageScrollToPlayingItem.Text" xml:space="preserve">
<value>प्लेइंग आइटम पर स्क्रॉल करें</value> <value>प्लेइंग आइटम पर स्क्रॉल करें</value>
</data> </data>
<data name="MusicGalleryPageSelectAll.Content" xml:space="preserve">
<value>सभी चुनें</value>
</data>
<data name="MusicGalleryPageSingleLoop.Text" xml:space="preserve"> <data name="MusicGalleryPageSingleLoop.Text" xml:space="preserve">
<value>एकल लूप</value> <value>एकल लूप</value>
</data> </data>
@@ -513,20 +516,29 @@
<data name="MusicGalleryPageSortType.Text" xml:space="preserve"> <data name="MusicGalleryPageSortType.Text" xml:space="preserve">
<value>क्रमबद्ध प्रकार</value> <value>क्रमबद्ध प्रकार</value>
</data> </data>
<data name="MusicGalleryPageStarredPlaylist.Content" xml:space="preserve">
<value>तारांकित प्लेलिस्ट</value>
</data>
<data name="MusicGalleryPageStopTrack.Text" xml:space="preserve"> <data name="MusicGalleryPageStopTrack.Text" xml:space="preserve">
<value>रोकें</value> <value>रोकें</value>
</data> </data>
<data name="MusicGalleryPageTitle" xml:space="preserve"> <data name="MusicGalleryPageTitle" xml:space="preserve">
<value>संगीत लाइब्रेरी - BetterLyrics</value> <value>संगीत लाइब्रेरी - BetterLyrics</value>
</data> </data>
<data name="MusicGalleryWindowDownButtonToolTip.Content" xml:space="preserve"> <data name="MusicSettingsControlAutoSyncInterval.Header" xml:space="preserve">
<value>वापस लें</value> <value>ऑटो-सिंक आवृत्ति</value>
</data> </data>
<data name="MusicGalleryWindowUpButtonToolTip.Content" xml:space="preserve"> <data name="MusicSettingsControlAutoSyncIntervalDisabled.Content" xml:space="preserve">
<value>विस्तार करें</value> <value>कभी नहीं</value>
</data>
<data name="MusicSettingsControlAutoSyncIntervalEveryDay.Content" xml:space="preserve">
<value>प्रतिदिन</value>
</data>
<data name="MusicSettingsControlAutoSyncIntervalEveryFifteenMin.Content" xml:space="preserve">
<value>हर 15 मिनट</value>
</data>
<data name="MusicSettingsControlAutoSyncIntervalEveryHour.Content" xml:space="preserve">
<value>हर घंटे</value>
</data>
<data name="MusicSettingsControlAutoSyncIntervalEverySixHrs.Content" xml:space="preserve">
<value>हर ६ घंटे</value>
</data> </data>
<data name="NarrowMode" xml:space="preserve"> <data name="NarrowMode" xml:space="preserve">
<value>संकीर्ण मोड</value> <value>संकीर्ण मोड</value>
@@ -543,12 +555,27 @@
<data name="PrivacyPolicy.Content" xml:space="preserve"> <data name="PrivacyPolicy.Content" xml:space="preserve">
<value>गोपनीयता नीति</value> <value>गोपनीयता नीति</value>
</data> </data>
<data name="RemoteServerConfigControlBrowse.Content" xml:space="preserve">
<value>ब्राउज करें</value>
</data>
<data name="RemoteServerConfigControlName.Header" xml:space="preserve">
<value>नाम</value>
</data>
<data name="RemoteServerConfigControlName.PlaceholderText" xml:space="preserve">
<value>इसे खाली छोड़ने से अपने आप एक डिफ़ॉल्ट नाम बन जाएगा।</value>
</data>
<data name="RemoteServerConfigControlPassword.Header" xml:space="preserve"> <data name="RemoteServerConfigControlPassword.Header" xml:space="preserve">
<value>पासवर्ड</value> <value>पासवर्ड</value>
</data> </data>
<data name="RemoteServerConfigControlPath.Header" xml:space="preserve"> <data name="RemoteServerConfigControlPath.Header" xml:space="preserve">
<value>पथ</value> <value>पथ</value>
</data> </data>
<data name="RemoteServerConfigControlPathNotExisted" xml:space="preserve">
<value>बताया गया फ़ोल्डर पाथ नहीं मिला</value>
</data>
<data name="RemoteServerConfigControlPathRequired" xml:space="preserve">
<value>पथ आवश्यक है</value>
</data>
<data name="RemoteServerConfigControlPort.Header" xml:space="preserve"> <data name="RemoteServerConfigControlPort.Header" xml:space="preserve">
<value>पोर्ट</value> <value>पोर्ट</value>
</data> </data>
@@ -576,9 +603,6 @@
<data name="SetingsPageFeedback.Text" xml:space="preserve"> <data name="SetingsPageFeedback.Text" xml:space="preserve">
<value>फीडबैक</value> <value>फीडबैक</value>
</data> </data>
<data name="SetingsPageInstructions.Text" xml:space="preserve">
<value>उपयोगकर्ता गाइड</value>
</data>
<data name="SetingsPageSpecialThanks.Text" xml:space="preserve"> <data name="SetingsPageSpecialThanks.Text" xml:space="preserve">
<value>विशेष आभार</value> <value>विशेष आभार</value>
</data> </data>
@@ -606,9 +630,6 @@
<data name="SettingsPageAddFolderButton.Content" xml:space="preserve"> <data name="SettingsPageAddFolderButton.Content" xml:space="preserve">
<value>जोड़ें</value> <value>जोड़ें</value>
</data> </data>
<data name="SettingsPageAdvanced.Text" xml:space="preserve">
<value>उन्नत विकल्प</value>
</data>
<data name="SettingsPageAlbum.Header" xml:space="preserve"> <data name="SettingsPageAlbum.Header" xml:space="preserve">
<value>एल्बम</value> <value>एल्बम</value>
</data> </data>
@@ -624,15 +645,9 @@
<data name="SettingsPageAlbumArtSearchProvidersConfig.Text" xml:space="preserve"> <data name="SettingsPageAlbumArtSearchProvidersConfig.Text" xml:space="preserve">
<value>एल्बम कला स्रोत कॉन्फ़िगर करें</value> <value>एल्बम कला स्रोत कॉन्फ़िगर करें</value>
</data> </data>
<data name="SettingsPageAlbumArtSize.Header" xml:space="preserve">
<value>एल्बम कला का आकार</value>
</data>
<data name="SettingsPageAlbumEffect.Text" xml:space="preserve"> <data name="SettingsPageAlbumEffect.Text" xml:space="preserve">
<value>एल्बम कला प्रभाव</value> <value>एल्बम कला प्रभाव</value>
</data> </data>
<data name="SettingsPageAlbumLib.Content" xml:space="preserve">
<value>एल्बम कला स्रोत</value>
</data>
<data name="SettingsPageAlbumRadius.Header" xml:space="preserve"> <data name="SettingsPageAlbumRadius.Header" xml:space="preserve">
<value>कोने की त्रिज्या</value> <value>कोने की त्रिज्या</value>
</data> </data>
@@ -663,12 +678,6 @@
<data name="SettingsPageAppAppearance.Text" xml:space="preserve"> <data name="SettingsPageAppAppearance.Text" xml:space="preserve">
<value>ऐप का रूप</value> <value>ऐप का रूप</value>
</data> </data>
<data name="SettingsPageAppBehavior.Text" xml:space="preserve">
<value>सामान्य व्यवहार</value>
</data>
<data name="SettingsPageApply.Content" xml:space="preserve">
<value>लागू करें</value>
</data>
<data name="SettingsPageArtist.Header" xml:space="preserve"> <data name="SettingsPageArtist.Header" xml:space="preserve">
<value>कलाकार</value> <value>कलाकार</value>
</data> </data>
@@ -687,23 +696,14 @@
<data name="SettingsPageAutoStart.Header" xml:space="preserve"> <data name="SettingsPageAutoStart.Header" xml:space="preserve">
<value>ऑटो स्टार्ट</value> <value>ऑटो स्टार्ट</value>
</data> </data>
<data name="SettingsPageAutoStartWindow.Header" xml:space="preserve">
<value>एप्लिकेशन शुरू करते समय</value>
</data>
<data name="SettingsPageBackdrop.Header" xml:space="preserve">
<value>बोल पृष्ठभूमि सामग्री</value>
</data>
<data name="SettingsPageBackgroundOverlay.Text" xml:space="preserve"> <data name="SettingsPageBackgroundOverlay.Text" xml:space="preserve">
<value>बोल पृष्ठभूमि</value> <value>बोल पृष्ठभूमि</value>
</data> </data>
<data name="SettingsPageBlurAmount.Header" xml:space="preserve"> <data name="SettingsPageBlurAmount.Header" xml:space="preserve">
<value>धुंधलापन मात्रा</value> <value>धुंधलापन मात्रा</value>
</data> </data>
<data name="SettingsPageBorderless.Header" xml:space="preserve">
<value> borderless विंडो</value>
</data>
<data name="SettingsPageCache.Description" xml:space="preserve"> <data name="SettingsPageCache.Description" xml:space="preserve">
<value>लॉग फ़ाइलें, नेटवर्क बोल कैश शामिल हैं</value> <value>लॉग फ़ाइलें, ऑनलाइन लिरिक्स कैश शामिल हैं</value>
</data> </data>
<data name="SettingsPageCache.Header" xml:space="preserve"> <data name="SettingsPageCache.Header" xml:space="preserve">
<value>कैश</value> <value>कैश</value>
@@ -738,9 +738,6 @@
<data name="SettingsPageCollapseDropdown.Content" xml:space="preserve"> <data name="SettingsPageCollapseDropdown.Content" xml:space="preserve">
<value>ड्रॉपडाउन संक्षिप्त करें</value> <value>ड्रॉपडाउन संक्षिप्त करें</value>
</data> </data>
<data name="SettingsPageCompactTitleBar.Content" xml:space="preserve">
<value>कॉम्पैक्ट</value>
</data>
<data name="SettingsPageConfigName.Description" xml:space="preserve"> <data name="SettingsPageConfigName.Description" xml:space="preserve">
<value>रिकॉर्ड की गई विंडो स्थिति का नामकरण करने से आपको उन्हें बेहतर ढंग से अलग करने में मदद मिल सकती है</value> <value>रिकॉर्ड की गई विंडो स्थिति का नामकरण करने से आपको उन्हें बेहतर ढंग से अलग करने में मदद मिल सकती है</value>
</data> </data>
@@ -759,18 +756,12 @@
<data name="SettingsPageCrossfade.Content" xml:space="preserve"> <data name="SettingsPageCrossfade.Content" xml:space="preserve">
<value>क्रॉसफ़ेड</value> <value>क्रॉसफ़ेड</value>
</data> </data>
<data name="SettingsPageCurrentLyricsWindowStatus.Text" xml:space="preserve">
<value>वर्तमान बोल विंडो स्थिति</value>
</data>
<data name="SettingsPageCutletDockerServer.Header" xml:space="preserve"> <data name="SettingsPageCutletDockerServer.Header" xml:space="preserve">
<value>cutlet-docker लिप्यंतरण सेवा</value> <value>cutlet-docker लिप्यंतरण सेवा</value>
</data> </data>
<data name="SettingsPageDark.Content" xml:space="preserve"> <data name="SettingsPageDark.Content" xml:space="preserve">
<value>डार्क</value> <value>डार्क</value>
</data> </data>
<data name="SettingsPageDebugOverlay.Header" xml:space="preserve">
<value>डीबग ओवरले दिखाएं</value>
</data>
<data name="SettingsPageDelete.Text" xml:space="preserve"> <data name="SettingsPageDelete.Text" xml:space="preserve">
<value>हटाएं</value> <value>हटाएं</value>
</data> </data>
@@ -801,15 +792,9 @@
<data name="SettingsPageDockPlacementTop.Content" xml:space="preserve"> <data name="SettingsPageDockPlacementTop.Content" xml:space="preserve">
<value>ऊपरी</value> <value>ऊपरी</value>
</data> </data>
<data name="SettingsPageDockWindowHeight.Header" xml:space="preserve">
<value>विंडो की ऊंचाई</value>
</data>
<data name="SettingsPageDragArea.Header" xml:space="preserve"> <data name="SettingsPageDragArea.Header" xml:space="preserve">
<value>खींचने योग्य क्षेत्र</value> <value>खींचने योग्य क्षेत्र</value>
</data> </data>
<data name="SettingsPageEasingFuncType.Header" xml:space="preserve">
<value>ईज़िंग एनीमेशन प्रकार</value>
</data>
<data name="SettingsPageEasingTypeEaseInOutBack.Content" xml:space="preserve"> <data name="SettingsPageEasingTypeEaseInOutBack.Content" xml:space="preserve">
<value>EaseInOutBack</value> <value>EaseInOutBack</value>
</data> </data>
@@ -873,18 +858,15 @@
<data name="SettingsPageExitOnLyricsWindowClosed.Header" xml:space="preserve"> <data name="SettingsPageExitOnLyricsWindowClosed.Header" xml:space="preserve">
<value>बोल विंडो बंद होने पर बाहर निकलें</value> <value>बोल विंडो बंद होने पर बाहर निकलें</value>
</data> </data>
<data name="SettingsPageExportPlayHistoryButton.Content" xml:space="preserve">
<value>प्ले इतिहास निर्यात करें</value>
</data>
<data name="SettingsPageExportSettingsButton.Content" xml:space="preserve"> <data name="SettingsPageExportSettingsButton.Content" xml:space="preserve">
<value>सेटिंग्स निर्यात करें</value> <value>सेटिंग्स निर्यात करें</value>
</data> </data>
<data name="SettingsPageExtendedTitleBar.Content" xml:space="preserve">
<value>विस्तारित</value>
</data>
<data name="SettingsPageFan.Header" xml:space="preserve"> <data name="SettingsPageFan.Header" xml:space="preserve">
<value>पंखे जैसे बोल</value> <value>पंखे जैसे बोल</value>
</data> </data>
<data name="SettingsPageFAQ.Content" xml:space="preserve">
<value>अक्सर पूछे जाने वाले प्रश्न</value>
</data>
<data name="SettingsPageFixedTimeStep.Header" xml:space="preserve"> <data name="SettingsPageFixedTimeStep.Header" xml:space="preserve">
<value>निश्चित समय चरण रेंडरिंग</value> <value>निश्चित समय चरण रेंडरिंग</value>
</data> </data>
@@ -921,9 +903,6 @@
<data name="SettingsPageHeight.Header" xml:space="preserve"> <data name="SettingsPageHeight.Header" xml:space="preserve">
<value>ऊंचाई</value> <value>ऊंचाई</value>
</data> </data>
<data name="SettingsPageHello.Text" xml:space="preserve">
<value>नमस्ते</value>
</data>
<data name="SettingsPageHelpUsTranslate.Content" xml:space="preserve"> <data name="SettingsPageHelpUsTranslate.Content" xml:space="preserve">
<value>इस एप्लिकेशन का अनुवाद करने में हमारी सहायता करें</value> <value>इस एप्लिकेशन का अनुवाद करने में हमारी सहायता करें</value>
</data> </data>
@@ -954,9 +933,6 @@
<data name="SettingsPageJapanese.Header" xml:space="preserve"> <data name="SettingsPageJapanese.Header" xml:space="preserve">
<value>जापानी ध्वन्यात्मकता</value> <value>जापानी ध्वन्यात्मकता</value>
</data> </data>
<data name="SettingsPageJoinNowButton.Content" xml:space="preserve">
<value>अभी शामिल हों</value>
</data>
<data name="SettingsPageJyutping.Content" xml:space="preserve"> <data name="SettingsPageJyutping.Content" xml:space="preserve">
<value>ज्यूतपिंग (केंटोनीज़)</value> <value>ज्यूतपिंग (केंटोनीज़)</value>
</data> </data>
@@ -1005,18 +981,12 @@
<data name="SettingsPageLight.Content" xml:space="preserve"> <data name="SettingsPageLight.Content" xml:space="preserve">
<value>लाइट</value> <value>लाइट</value>
</data> </data>
<data name="SettingsPageLinkedFile.Text" xml:space="preserve">
<value>लिंक की गई स्थानीय फ़ाइलें</value>
</data>
<data name="SettingsPageListenNewSession.Header" xml:space="preserve"> <data name="SettingsPageListenNewSession.Header" xml:space="preserve">
<value>नए प्लेबैक स्रोतों को सुनना सक्षम करें</value> <value>नए प्लेबैक स्रोतों को सुनना सक्षम करें</value>
</data> </data>
<data name="SettingsPageLocalFolder.Text" xml:space="preserve"> <data name="SettingsPageLocalFolder.Text" xml:space="preserve">
<value>स्थानीय फ़ोल्डर</value> <value>स्थानीय फ़ोल्डर</value>
</data> </data>
<data name="SettingsPageLog.Header" xml:space="preserve">
<value>लॉगिंग</value>
</data>
<data name="SettingsPageLongSyllableDuration.Header" xml:space="preserve"> <data name="SettingsPageLongSyllableDuration.Header" xml:space="preserve">
<value>दीर्घ शब्दांश थ्रेसहोल्ड</value> <value>दीर्घ शब्दांश थ्रेसहोल्ड</value>
</data> </data>
@@ -1071,15 +1041,6 @@
<data name="SettingsPageLyricsFgFontColor.Header" xml:space="preserve"> <data name="SettingsPageLyricsFgFontColor.Header" xml:space="preserve">
<value>वर्तमान पंक्ति</value> <value>वर्तमान पंक्ति</value>
</data> </data>
<data name="SettingsPageLyricsFgFontColorAdaptiveColored.Content" xml:space="preserve">
<value>बोल पृष्ठभूमि के अनुकूल (रंगीन)</value>
</data>
<data name="SettingsPageLyricsFgFontColorAdaptiveGrayed.Content" xml:space="preserve">
<value>बोल पृष्ठभूमि के अनुकूल (धूसर)</value>
</data>
<data name="SettingsPageLyricsFgFontColorCustom.Content" xml:space="preserve">
<value>कस्टम</value>
</data>
<data name="SettingsPageLyricsFloatAnimation.Header" xml:space="preserve"> <data name="SettingsPageLyricsFloatAnimation.Header" xml:space="preserve">
<value>फ़्लोट एनीमेशन</value> <value>फ़्लोट एनीमेशन</value>
</data> </data>
@@ -1107,27 +1068,12 @@
<data name="SettingsPageLyricsGlowEffect.Header" xml:space="preserve"> <data name="SettingsPageLyricsGlowEffect.Header" xml:space="preserve">
<value>चमक प्रभाव</value> <value>चमक प्रभाव</value>
</data> </data>
<data name="SettingsPageLyricsHighlight.Header" xml:space="preserve">
<value>हाइलाइट</value>
</data>
<data name="SettingsPageLyricsHighlightScope.Header" xml:space="preserve">
<value>मूल पाठ हाइलाइटिंग स्कोप</value>
</data>
<data name="SettingsPageLyricsLeft.Content" xml:space="preserve">
<value>बायां</value>
</data>
<data name="SettingsPageLyricsLight.Content" xml:space="preserve"> <data name="SettingsPageLyricsLight.Content" xml:space="preserve">
<value>लाइट</value> <value>लाइट</value>
</data> </data>
<data name="SettingsPageLyricsLineFade.Header" xml:space="preserve">
<value>प्लेबैक क्षेत्र किनारे का ग्रेडिएंट</value>
</data>
<data name="SettingsPageLyricsLineSpacingFactor.Header" xml:space="preserve"> <data name="SettingsPageLyricsLineSpacingFactor.Header" xml:space="preserve">
<value>लाइन स्पेसिंग</value> <value>लाइन स्पेसिंग</value>
</data> </data>
<data name="SettingsPageLyricsLineSpacingFactorUnit.Text" xml:space="preserve">
<value> गुना लाइन ऊंचाई</value>
</data>
<data name="SettingsPageLyricsMedium.Content" xml:space="preserve"> <data name="SettingsPageLyricsMedium.Content" xml:space="preserve">
<value>मध्यम</value> <value>मध्यम</value>
</data> </data>
@@ -1170,9 +1116,6 @@
<data name="SettingsPageLyricsSemiLight.Content" xml:space="preserve"> <data name="SettingsPageLyricsSemiLight.Content" xml:space="preserve">
<value>सेमी लाइट</value> <value>सेमी लाइट</value>
</data> </data>
<data name="SettingsPageLyricsShadow.Header" xml:space="preserve">
<value>छाया</value>
</data>
<data name="SettingsPageLyricsStyle.Text" xml:space="preserve"> <data name="SettingsPageLyricsStyle.Text" xml:space="preserve">
<value>बोल शैली</value> <value>बोल शैली</value>
</data> </data>
@@ -1188,30 +1131,15 @@
<data name="SettingsPageLyricsTimelineThreshold.Header" xml:space="preserve"> <data name="SettingsPageLyricsTimelineThreshold.Header" xml:space="preserve">
<value>बोल समयरेखा सिंक थ्रेसहोल्ड</value> <value>बोल समयरेखा सिंक थ्रेसहोल्ड</value>
</data> </data>
<data name="SettingsPageLyricsTranslationHighlight.Header" xml:space="preserve">
<value>अनुवाद हाइलाइट</value>
</data>
<data name="SettingsPageLyricsTranslationSeparator.Header" xml:space="preserve">
<value>मूल अनुवाद विभाजक</value>
</data>
<data name="SettingsPageLyricsVerticalEdgeOpacity.Header" xml:space="preserve">
<value>लंबवत किनारे की अस्पष्टता</value>
</data>
<data name="SettingsPageLyricsWindow.Text" xml:space="preserve"> <data name="SettingsPageLyricsWindow.Text" xml:space="preserve">
<value>बोल विंडो</value> <value>बोल विंडो</value>
</data> </data>
<data name="SettingsPageLyricsWindowManager.Text" xml:space="preserve">
<value>बोल विंडो प्रबंधक</value>
</data>
<data name="SettingsPageLyricsWindowMgr.Content" xml:space="preserve"> <data name="SettingsPageLyricsWindowMgr.Content" xml:space="preserve">
<value>बोल विंडो प्रबंधक</value> <value>बोल विंडो प्रबंधक</value>
</data> </data>
<data name="SettingsPageLyricsWindowSwitchHotKey.Header" xml:space="preserve"> <data name="SettingsPageLyricsWindowSwitchHotKey.Header" xml:space="preserve">
<value>बोल विंडो स्थिति स्विच शॉर्टकट</value> <value>बोल विंडो स्थिति स्विच शॉर्टकट</value>
</data> </data>
<data name="SettingsPageLyricsWindowToolTip.Content" xml:space="preserve">
<value>बोल विंडो</value>
</data>
<data name="SettingsPageMatchingThreshold.Description" xml:space="preserve"> <data name="SettingsPageMatchingThreshold.Description" xml:space="preserve">
<value>इस मान को समायोजित करने से अनुक्रमिक खोज और सर्वोत्तम मिलान खोज परिणाम प्रभावित होंगे, लेकिन मैनुअल बोल खोज इंटरफ़ेस में खोज परिणाम प्रभावित नहीं होंगे</value> <value>इस मान को समायोजित करने से अनुक्रमिक खोज और सर्वोत्तम मिलान खोज परिणाम प्रभावित होंगे, लेकिन मैनुअल बोल खोज इंटरफ़ेस में खोज परिणाम प्रभावित नहीं होंगे</value>
</data> </data>
@@ -1248,18 +1176,12 @@
<data name="SettingsPageMusicLib.Header" xml:space="preserve"> <data name="SettingsPageMusicLib.Header" xml:space="preserve">
<value>स्थानीय मीडिया लाइब्रेरी</value> <value>स्थानीय मीडिया लाइब्रेरी</value>
</data> </data>
<data name="SettingsPageMusicLibRealTimeWatch.Header" xml:space="preserve">
<value>फ़ाइल परिवर्तनों की वास्तविक समय निगरानी</value>
</data>
<data name="SettingsPageNarrowMode.Text" xml:space="preserve"> <data name="SettingsPageNarrowMode.Text" xml:space="preserve">
<value>संकीर्ण मोड</value> <value>संकीर्ण मोड</value>
</data> </data>
<data name="SettingsPageNextSongHotKey.Header" xml:space="preserve"> <data name="SettingsPageNextSongHotKey.Header" xml:space="preserve">
<value>अगला ट्रैक शॉर्टकट</value> <value>अगला ट्रैक शॉर्टकट</value>
</data> </data>
<data name="SettingsPageNoBackdrop.Content" xml:space="preserve">
<value>कोई नहीं</value>
</data>
<data name="SettingsPageOctTree.Content" xml:space="preserve"> <data name="SettingsPageOctTree.Content" xml:space="preserve">
<value>आक्रामक</value> <value>आक्रामक</value>
</data> </data>
@@ -1287,9 +1209,6 @@
<data name="SettingsPagePathIncludingOthersInfo" xml:space="preserve"> <data name="SettingsPagePathIncludingOthersInfo" xml:space="preserve">
<value>इस फ़ोल्डर में पहले से जोड़े गए फ़ोल्डर शामिल हैं, कृपया इस फ़ोल्डर को जोड़ने के लिए उन फ़ोल्डरों को हटा दें</value> <value>इस फ़ोल्डर में पहले से जोड़े गए फ़ोल्डर शामिल हैं, कृपया इस फ़ोल्डर को जोड़ने के लिए उन फ़ोल्डरों को हटा दें</value>
</data> </data>
<data name="SettingsPagePathNotFound.Text" xml:space="preserve">
<value>आपके कंप्यूटर में पथ नहीं मिल सका</value>
</data>
<data name="SettingsPagePatrons.Text" xml:space="preserve"> <data name="SettingsPagePatrons.Text" xml:space="preserve">
<value>प्रायोजक</value> <value>प्रायोजक</value>
</data> </data>
@@ -1335,15 +1254,9 @@
<data name="SettingsPageRealtimeStatus.Text" xml:space="preserve"> <data name="SettingsPageRealtimeStatus.Text" xml:space="preserve">
<value>वास्तविक समय स्थिति</value> <value>वास्तविक समय स्थिति</value>
</data> </data>
<data name="SettingsPageRecord.Content" xml:space="preserve">
<value>रिकॉर्ड</value>
</data>
<data name="SettingsPageRecordedWindowStatus.Text" xml:space="preserve"> <data name="SettingsPageRecordedWindowStatus.Text" xml:space="preserve">
<value>रिकॉर्ड की गई विंडो स्थिति</value> <value>रिकॉर्ड की गई विंडो स्थिति</value>
</data> </data>
<data name="SettingsPageReference.Header" xml:space="preserve">
<value>संदर्भ लिंक</value>
</data>
<data name="SettingsPageRefreshDropdown.Content" xml:space="preserve"> <data name="SettingsPageRefreshDropdown.Content" xml:space="preserve">
<value>ड्रॉपडाउन रीफ्रेश करें</value> <value>ड्रॉपडाउन रीफ्रेश करें</value>
</data> </data>
@@ -1362,9 +1275,6 @@
<data name="SettingsPageRight.Content" xml:space="preserve"> <data name="SettingsPageRight.Content" xml:space="preserve">
<value>दायां</value> <value>दायां</value>
</data> </data>
<data name="SettingsPageRomaji.Header" xml:space="preserve">
<value>जापानी ध्वन्यात्मकता</value>
</data>
<data name="SettingsPageScope.Header" xml:space="preserve"> <data name="SettingsPageScope.Header" xml:space="preserve">
<value>स्कोप</value> <value>स्कोप</value>
</data> </data>
@@ -1404,6 +1314,9 @@
<data name="SettingsPageSettingsManager.Header" xml:space="preserve"> <data name="SettingsPageSettingsManager.Header" xml:space="preserve">
<value>सेटिंग्स प्रबंधक</value> <value>सेटिंग्स प्रबंधक</value>
</data> </data>
<data name="SettingsPageSettingsPlayHistory.Header" xml:space="preserve">
<value>प्ले इतिहास</value>
</data>
<data name="SettingsPageShareHub.Content" xml:space="preserve"> <data name="SettingsPageShareHub.Content" xml:space="preserve">
<value>ऑनलाइन संसाधन शेयरिंग हब ब्राउज़ करें</value> <value>ऑनलाइन संसाधन शेयरिंग हब ब्राउज़ करें</value>
</data> </data>
@@ -1431,18 +1344,12 @@
<data name="SettingsPageShowInSwitchers.Header" xml:space="preserve"> <data name="SettingsPageShowInSwitchers.Header" xml:space="preserve">
<value>सिस्टम वातावरण में दिखाएं</value> <value>सिस्टम वातावरण में दिखाएं</value>
</data> </data>
<data name="SettingsPageShowLayoutDragger.Header" xml:space="preserve">
<value>लेआउट स्प्लिटर दिखाएं</value>
</data>
<data name="SettingsPageShowTitle.Header" xml:space="preserve"> <data name="SettingsPageShowTitle.Header" xml:space="preserve">
<value>शीर्षक दिखाएं</value> <value>शीर्षक दिखाएं</value>
</data> </data>
<data name="SettingsPageSlide.Content" xml:space="preserve"> <data name="SettingsPageSlide.Content" xml:space="preserve">
<value>स्लाइड</value> <value>स्लाइड</value>
</data> </data>
<data name="SettingsPageSliderPrefix.Text" xml:space="preserve">
<value>वर्तमान मान: </value>
</data>
<data name="SettingsPageSnowFlakeLayer.Header" xml:space="preserve"> <data name="SettingsPageSnowFlakeLayer.Header" xml:space="preserve">
<value>स्नोफ्लेक परत</value> <value>स्नोफ्लेक परत</value>
</data> </data>
@@ -1485,6 +1392,9 @@
<data name="SettingsPageStartup.Text" xml:space="preserve"> <data name="SettingsPageStartup.Text" xml:space="preserve">
<value>स्टार्टअप</value> <value>स्टार्टअप</value>
</data> </data>
<data name="SettingsPageStats.Content" xml:space="preserve">
<value>आंकड़े</value>
</data>
<data name="SettingsPageStopTrackOnGalleryWindowClosed.Header" xml:space="preserve"> <data name="SettingsPageStopTrackOnGalleryWindowClosed.Header" xml:space="preserve">
<value>संगीत गैलरी विंडो बंद होने पर प्लेबैक रोकें</value> <value>संगीत गैलरी विंडो बंद होने पर प्लेबैक रोकें</value>
</data> </data>
@@ -1503,9 +1413,6 @@
<data name="SettingsPageTaskbarPlacement.Header" xml:space="preserve"> <data name="SettingsPageTaskbarPlacement.Header" xml:space="preserve">
<value>टास्कबार फिक्सिंग स्थिति</value> <value>टास्कबार फिक्सिंग स्थिति</value>
</data> </data>
<data name="SettingsPageThanksForPurchasing.Text" xml:space="preserve">
<value>BetterLyrics खरीदने के लिए धन्यवाद</value>
</data>
<data name="SettingsPageThanksList.Header" xml:space="preserve"> <data name="SettingsPageThanksList.Header" xml:space="preserve">
<value>आभार सूची</value> <value>आभार सूची</value>
</data> </data>
@@ -1524,12 +1431,6 @@
<data name="SettingsPageTitleBarAreaWhole.Content" xml:space="preserve"> <data name="SettingsPageTitleBarAreaWhole.Content" xml:space="preserve">
<value>पूरी विंडो</value> <value>पूरी विंडो</value>
</data> </data>
<data name="SettingsPageTitleBarType.Header" xml:space="preserve">
<value>शीर्षक बार का आकार</value>
</data>
<data name="SettingsPageToggleHotKey.Header" xml:space="preserve">
<value>कट-इन और कट-आउट शॉर्टकट</value>
</data>
<data name="SettingsPageTranslatedText.Header" xml:space="preserve"> <data name="SettingsPageTranslatedText.Header" xml:space="preserve">
<value>अनुवाद</value> <value>अनुवाद</value>
</data> </data>
@@ -1539,9 +1440,6 @@
<data name="SettingsPageTranslationConfig.Header" xml:space="preserve"> <data name="SettingsPageTranslationConfig.Header" xml:space="preserve">
<value>LibreTranslate अनुवाद सेवा</value> <value>LibreTranslate अनुवाद सेवा</value>
</data> </data>
<data name="SettingsPageTranslationInfoLink.Text" xml:space="preserve">
<value>इंस्टॉलेशन ट्यूटोरियल और अधिक जानकारी के लिए https://github.com/LibreTranslate/LibreTranslate पर जाएं (इस सॉफ़्टवेयर का इस अनुवाद सेवा से कोई संबंध नहीं है)</value>
</data>
<data name="SettingsPageUserWhoPurchased.Text" xml:space="preserve"> <data name="SettingsPageUserWhoPurchased.Text" xml:space="preserve">
<value>और वे उपयोगकर्ता जिन्होंने BetterLyrics को खरीदा और समर्थन किया</value> <value>और वे उपयोगकर्ता जिन्होंने BetterLyrics को खरीदा और समर्थन किया</value>
</data> </data>
@@ -1554,9 +1452,6 @@
<data name="SettingsPageWidth.Header" xml:space="preserve"> <data name="SettingsPageWidth.Header" xml:space="preserve">
<value>चौड़ाई</value> <value>चौड़ाई</value>
</data> </data>
<data name="SettingsPageWindowBounds.Header" xml:space="preserve">
<value>विंडो सीमाएं</value>
</data>
<data name="SettingsPageWorkArea.Description" xml:space="preserve"> <data name="SettingsPageWorkArea.Description" xml:space="preserve">
<value>एक अलग कार्यक्षेत्र के रूप में, स्क्रीन के ऊपरी/निचले किनारे पर डॉक किया गया</value> <value>एक अलग कार्यक्षेत्र के रूप में, स्क्रीन के ऊपरी/निचले किनारे पर डॉक किया गया</value>
</data> </data>
@@ -1572,6 +1467,39 @@
<data name="StandardMode" xml:space="preserve"> <data name="StandardMode" xml:space="preserve">
<value>मानक मोड</value> <value>मानक मोड</value>
</data> </data>
<data name="StatsDashboardControlSources.Text" xml:space="preserve">
<value>स्रोत</value>
</data>
<data name="StatsDashboardControlThisMonth.Header" xml:space="preserve">
<value>इस महीने</value>
</data>
<data name="StatsDashboardControlThisQuarter.Header" xml:space="preserve">
<value>इस तिमाही</value>
</data>
<data name="StatsDashboardControlThisWeek.Header" xml:space="preserve">
<value>इस सप्ताह</value>
</data>
<data name="StatsDashboardControlThisYear.Header" xml:space="preserve">
<value>इस वर्ष</value>
</data>
<data name="StatsDashboardControlToday.Header" xml:space="preserve">
<value>आज</value>
</data>
<data name="StatsDashboardControlTopArtists.Text" xml:space="preserve">
<value>शीर्ष कलाकार</value>
</data>
<data name="StatsDashboardControlTopSongs.Text" xml:space="preserve">
<value>शीर्ष रास्ता</value>
</data>
<data name="StatsDashboardControlTopSource.Text" xml:space="preserve">
<value>शीर्ष स्रोत</value>
</data>
<data name="StatsDashboardControlTotalDuration.Text" xml:space="preserve">
<value>कुल अवधि</value>
</data>
<data name="StatsDashboardControlTracksPlayed.Text" xml:space="preserve">
<value>बजाए गए ट्रैक</value>
</data>
<data name="SystemTrayExit.Text" xml:space="preserve"> <data name="SystemTrayExit.Text" xml:space="preserve">
<value>कार्यक्रम से बाहर निकलें</value> <value>कार्यक्रम से बाहर निकलें</value>
</data> </data>
@@ -1581,9 +1509,6 @@
<data name="SystemTrayMusicGallery.Text" xml:space="preserve"> <data name="SystemTrayMusicGallery.Text" xml:space="preserve">
<value>संगीत गैलरी खोलें</value> <value>संगीत गैलरी खोलें</value>
</data> </data>
<data name="SystemTrayPageTitle" xml:space="preserve">
<value>सिस्टम ट्रे - BetterLyrics</value>
</data>
<data name="SystemTrayResetWindowPosition.Text" xml:space="preserve"> <data name="SystemTrayResetWindowPosition.Text" xml:space="preserve">
<value>विंडो स्थिति रीसेट करें</value> <value>विंडो स्थिति रीसेट करें</value>
</data> </data>

View File

@@ -129,21 +129,12 @@
<data name="AlbumArtSearchSMTCProvider" xml:space="preserve"> <data name="AlbumArtSearchSMTCProvider" xml:space="preserve">
<value>Pemutar musik</value> <value>Pemutar musik</value>
</data> </data>
<data name="AllLyricsSettingsControlPictureInPicture.Content" xml:space="preserve">
<value>Mode Gambar-dalam-Gambar (PiP)</value>
</data>
<data name="AppSettingsControlGeneral.Text" xml:space="preserve"> <data name="AppSettingsControlGeneral.Text" xml:space="preserve">
<value>Jendela</value> <value>Jendela</value>
</data> </data>
<data name="ArtistsSplitHint.Text" xml:space="preserve"> <data name="ArtistsSplitHint.Text" xml:space="preserve">
<value>Saat memasukkan beberapa artis, silakan gunakan salah satu pemisah berikut untuk memisahkannya (jangan dicampur)</value> <value>Saat memasukkan beberapa artis, silakan gunakan salah satu pemisah berikut untuk memisahkannya (jangan dicampur)</value>
</data> </data>
<data name="BaseWindowHostInfoBarCheckBox.Content" xml:space="preserve">
<value>Jangan tampilkan pesan ini lagi</value>
</data>
<data name="BaseWindowMiniFlyoutItem.Text" xml:space="preserve">
<value>Mode Gambar-dalam-Gambar (PiP)</value>
</data>
<data name="Cancel" xml:space="preserve"> <data name="Cancel" xml:space="preserve">
<value>Batal</value> <value>Batal</value>
</data> </data>
@@ -168,24 +159,45 @@
<data name="DockedMode" xml:space="preserve"> <data name="DockedMode" xml:space="preserve">
<value>Mode Dok</value> <value>Mode Dok</value>
</data> </data>
<data name="Error" xml:space="preserve">
<value>Kesalahan</value>
</data>
<data name="ExportSettingsSuccess" xml:space="preserve"> <data name="ExportSettingsSuccess" xml:space="preserve">
<value>Ekspor berhasil</value> <value>Ekspor berhasil</value>
</data> </data>
<data name="FailToStartLXMusicServer" xml:space="preserve"> <data name="FailToStartLXMusicServer" xml:space="preserve">
<value>Tidak dapat terhubung ke server LX Music, silakan buka Pengaturan - Sumber Pemutaran - LX Music - Server LX Music untuk memeriksa apakah tautan telah dimasukkan dengan benar</value> <value>Tidak dapat terhubung ke server LX Music, silakan buka Pengaturan - Sumber Pemutaran - LX Music - Server LX Music untuk memeriksa apakah tautan telah dimasukkan dengan benar</value>
</data> </data>
<data name="FileSystemServiceCleaningCache" xml:space="preserve">
<value>Membersihkan cache...</value>
</data>
<data name="FileSystemServiceConnectFailed" xml:space="preserve">
<value>Koneksi gagal</value>
</data>
<data name="FileSystemServiceConnecting" xml:space="preserve">
<value>Menghubungkan...</value>
</data>
<data name="FileSystemServiceFetchingFileList" xml:space="preserve">
<value>Mengambil daftar file...</value>
</data>
<data name="FileSystemServiceParsing" xml:space="preserve">
<value>Penguraian...</value>
</data>
<data name="FileSystemServicePrepareToClean" xml:space="preserve">
<value>Bersiap untuk membersihkan cache...</value>
</data>
<data name="FileSystemServiceReady" xml:space="preserve">
<value>Siap</value>
</data>
<data name="FileSystemServiceRootDirectoryWarning" xml:space="preserve">
<value>Jalur direktori root telah terdeteksi. Indeks disk penuh mungkin berisi sejumlah besar file non-media dan menyebabkan pemindaian memakan waktu terlalu lama. Disarankan untuk menentukan subdirektori tertentu.</value>
</data>
<data name="FileSystemServiceWaitingForScan" xml:space="preserve">
<value>Menunggu pemindaian...</value>
</data>
<data name="FullscreenMode" xml:space="preserve"> <data name="FullscreenMode" xml:space="preserve">
<value>Mode Layar Penuh</value> <value>Mode Layar Penuh</value>
</data> </data>
<data name="HostWindowClickThroughButton.Content" xml:space="preserve">
<value>Kunci</value>
</data>
<data name="HostWindowClickThroughFlyoutItem.Text" xml:space="preserve">
<value>Kunci</value>
</data>
<data name="HostWindowLockToolTip.Text" xml:space="preserve">
<value>Kunci</value>
</data>
<data name="HostWindowMusicGalleryButtonToolTip.Content" xml:space="preserve"> <data name="HostWindowMusicGalleryButtonToolTip.Content" xml:space="preserve">
<value>Galeri Musik</value> <value>Galeri Musik</value>
</data> </data>
@@ -204,9 +216,6 @@
<data name="Jyutping" xml:space="preserve"> <data name="Jyutping" xml:space="preserve">
<value>Jyutping (Kanton)</value> <value>Jyutping (Kanton)</value>
</data> </data>
<data name="KeepAtLeastOneStatusDefault" xml:space="preserve">
<value>Pastikan setidaknya satu status diatur sebagai default</value>
</data>
<data name="LastFMAuthFailed" xml:space="preserve"> <data name="LastFMAuthFailed" xml:space="preserve">
<value>Otorisasi gagal, silakan coba lagi</value> <value>Otorisasi gagal, silakan coba lagi</value>
</data> </data>
@@ -270,18 +279,12 @@
<data name="LyricsPageSettings.Text" xml:space="preserve"> <data name="LyricsPageSettings.Text" xml:space="preserve">
<value>Pengaturan</value> <value>Pengaturan</value>
</data> </data>
<data name="LyricsPageTimelineOffsetButtonToolTip.Content" xml:space="preserve">
<value>Offset Waktu Lirik</value>
</data>
<data name="LyricsPageTranslationEnabled.Description" xml:space="preserve"> <data name="LyricsPageTranslationEnabled.Description" xml:space="preserve">
<value>Akan memprioritaskan membaca terjemahan di dalam lirik, jika tidak ada kecocokan maka akan meminta terjemahan mesin dari server LibreTranslate</value> <value>Akan memprioritaskan membaca terjemahan di dalam lirik, jika tidak ada kecocokan maka akan meminta terjemahan mesin dari server LibreTranslate</value>
</data> </data>
<data name="LyricsPageTranslationEnabled.Header" xml:space="preserve"> <data name="LyricsPageTranslationEnabled.Header" xml:space="preserve">
<value>Aktifkan Terjemahan</value> <value>Aktifkan Terjemahan</value>
</data> </data>
<data name="LyricsPageTranslationOnly.Header" xml:space="preserve">
<value>Hanya Tampilkan Terjemahan</value>
</data>
<data name="LyricsPageTranslationProviderPrefix.Header" xml:space="preserve"> <data name="LyricsPageTranslationProviderPrefix.Header" xml:space="preserve">
<value>Penyedia Terjemahan</value> <value>Penyedia Terjemahan</value>
</data> </data>
@@ -330,9 +333,6 @@
<data name="LyricsSearchControlSongInfoMapping.Text" xml:space="preserve"> <data name="LyricsSearchControlSongInfoMapping.Text" xml:space="preserve">
<value>Pemetaan Info Lagu</value> <value>Pemetaan Info Lagu</value>
</data> </data>
<data name="LyricsSearchControlTargetSearchProvider.Header" xml:space="preserve">
<value>Penyedia Pencarian Lirik Target</value>
</data>
<data name="LyricsSearchControlTitle.Header" xml:space="preserve"> <data name="LyricsSearchControlTitle.Header" xml:space="preserve">
<value>Judul</value> <value>Judul</value>
</data> </data>
@@ -351,15 +351,9 @@
<data name="LyricsSearchProviderTtmlFile" xml:space="preserve"> <data name="LyricsSearchProviderTtmlFile" xml:space="preserve">
<value>File .TTML Lokal</value> <value>File .TTML Lokal</value>
</data> </data>
<data name="LyricsWindowImmersiveButtonToolTip.Content" xml:space="preserve">
<value>Mode Imersif</value>
</data>
<data name="LyricsWindowSettingsControlLyricsWindowConfig.Text" xml:space="preserve"> <data name="LyricsWindowSettingsControlLyricsWindowConfig.Text" xml:space="preserve">
<value>Konfigurasi</value> <value>Konfigurasi</value>
</data> </data>
<data name="LyricsWindowSettingsControlLyricsWindowMode.Header" xml:space="preserve">
<value>Mode Jendela Lirik</value>
</data>
<data name="LyricsWindowSettingsControlSetDefault.Text" xml:space="preserve"> <data name="LyricsWindowSettingsControlSetDefault.Text" xml:space="preserve">
<value>Tetapkan sebagai Default</value> <value>Tetapkan sebagai Default</value>
</data> </data>
@@ -378,9 +372,6 @@
<data name="MainPageAlbumArtOnly.Content" xml:space="preserve"> <data name="MainPageAlbumArtOnly.Content" xml:space="preserve">
<value>Hanya tampilkan area sampul album</value> <value>Hanya tampilkan area sampul album</value>
</data> </data>
<data name="MainPageEnterImmersiveModeHint" xml:space="preserve">
<value>Arahkan kursor lagi untuk menampilkan tombol sakelar</value>
</data>
<data name="MainPageLyriscOnly.Content" xml:space="preserve"> <data name="MainPageLyriscOnly.Content" xml:space="preserve">
<value>Hanya tampilkan lirik</value> <value>Hanya tampilkan lirik</value>
</data> </data>
@@ -396,6 +387,18 @@
<data name="MainPageSplitView.Content" xml:space="preserve"> <data name="MainPageSplitView.Content" xml:space="preserve">
<value>Tampilan Terpisah</value> <value>Tampilan Terpisah</value>
</data> </data>
<data name="MediaSettingsControlLastSyncTime.Header" xml:space="preserve">
<value>Waktu Sinkronisasi Terakhir</value>
</data>
<data name="MediaSettingsControlLocalFolder" xml:space="preserve">
<value>Folder Lokal</value>
</data>
<data name="MediaSettingsControlNameSetting.Header" xml:space="preserve">
<value>Nama</value>
</data>
<data name="MediaSettingsControlSyncNow.Content" xml:space="preserve">
<value>Sinkronisasi sekarang</value>
</data>
<data name="MusicGalleryPageAddToCustomList.Text" xml:space="preserve"> <data name="MusicGalleryPageAddToCustomList.Text" xml:space="preserve">
<value>Tambahkan ke daftar putar</value> <value>Tambahkan ke daftar putar</value>
</data> </data>
@@ -406,11 +409,17 @@
<value>Item berikutnya</value> <value>Item berikutnya</value>
</data> </data>
<data name="MusicGalleryPageAddToPlayingQueue.Text" xml:space="preserve"> <data name="MusicGalleryPageAddToPlayingQueue.Text" xml:space="preserve">
<value>Tambahkan ke antrean putar</value> <value>Tambahkan ke antrian bermain</value>
</data> </data>
<data name="MusicGalleryPageAllSongs" xml:space="preserve"> <data name="MusicGalleryPageAllSongs" xml:space="preserve">
<value>Semua Musik</value> <value>Semua Musik</value>
</data> </data>
<data name="MusicGalleryPageDataSync.Message" xml:space="preserve">
<value>Sinkronisasi Perpustakaan Media sedang berlangsung...</value>
</data>
<data name="MusicGalleryPageDataSyncError.Message" xml:space="preserve">
<value>Ada masalah dengan sinkronisasi Perpustakaan Media</value>
</data>
<data name="MusicGalleryPageEmptyPlayingQueue.Text" xml:space="preserve"> <data name="MusicGalleryPageEmptyPlayingQueue.Text" xml:space="preserve">
<value>Bersihkan antrean putar</value> <value>Bersihkan antrean putar</value>
</data> </data>
@@ -420,9 +429,6 @@
<data name="MusicGalleryPageFileArtist.Header" xml:space="preserve"> <data name="MusicGalleryPageFileArtist.Header" xml:space="preserve">
<value>Artis</value> <value>Artis</value>
</data> </data>
<data name="MusicGalleryPageFileInfo.Text" xml:space="preserve">
<value>Info File</value>
</data>
<data name="MusicGalleryPageFileInfoBitDepth.Header" xml:space="preserve"> <data name="MusicGalleryPageFileInfoBitDepth.Header" xml:space="preserve">
<value>Kedalaman Bit</value> <value>Kedalaman Bit</value>
</data> </data>
@@ -456,14 +462,14 @@
<data name="MusicGalleryPageFileNotFound.Text" xml:space="preserve"> <data name="MusicGalleryPageFileNotFound.Text" xml:space="preserve">
<value>Tidak ada lagu yang ditemukan di pustaka media</value> <value>Tidak ada lagu yang ditemukan di pustaka media</value>
</data> </data>
<data name="MusicGalleryPageFolder.Text" xml:space="preserve">
<value>Folder</value>
</data>
<data name="MusicGalleryPageImportFromFile.Text" xml:space="preserve"> <data name="MusicGalleryPageImportFromFile.Text" xml:space="preserve">
<value>Impor dari file</value> <value>Impor dari file</value>
</data> </data>
<data name="MusicGalleryPageNewPlaylist.Text" xml:space="preserve"> <data name="MusicGalleryPageNewPlaylist.Text" xml:space="preserve">
<value>Buat daftar putar</value> <value>Membuat daftar putar</value>
</data>
<data name="MusicGalleryPagePlayAll.Content" xml:space="preserve">
<value>Putar Semua</value>
</data> </data>
<data name="MusicGalleryPagePlayingQueue.Text" xml:space="preserve"> <data name="MusicGalleryPagePlayingQueue.Text" xml:space="preserve">
<value>Antrean Putar</value> <value>Antrean Putar</value>
@@ -472,7 +478,7 @@
<value>Antrean putar kosong</value> <value>Antrean putar kosong</value>
</data> </data>
<data name="MusicGalleryPagePlaylist.Text" xml:space="preserve"> <data name="MusicGalleryPagePlaylist.Text" xml:space="preserve">
<value>Daftar Putar</value> <value>Daftar putar</value>
</data> </data>
<data name="MusicGalleryPageQueueLoop.Text" xml:space="preserve"> <data name="MusicGalleryPageQueueLoop.Text" xml:space="preserve">
<value>Loop daftar</value> <value>Loop daftar</value>
@@ -489,9 +495,6 @@
<data name="MusicGalleryPageScrollToPlayingItem.Text" xml:space="preserve"> <data name="MusicGalleryPageScrollToPlayingItem.Text" xml:space="preserve">
<value>Gulir ke item yang diputar</value> <value>Gulir ke item yang diputar</value>
</data> </data>
<data name="MusicGalleryPageSelectAll.Content" xml:space="preserve">
<value>Pilih Semua</value>
</data>
<data name="MusicGalleryPageSingleLoop.Text" xml:space="preserve"> <data name="MusicGalleryPageSingleLoop.Text" xml:space="preserve">
<value>Loop tunggal</value> <value>Loop tunggal</value>
</data> </data>
@@ -513,20 +516,29 @@
<data name="MusicGalleryPageSortType.Text" xml:space="preserve"> <data name="MusicGalleryPageSortType.Text" xml:space="preserve">
<value>Jenis Urutan</value> <value>Jenis Urutan</value>
</data> </data>
<data name="MusicGalleryPageStarredPlaylist.Content" xml:space="preserve">
<value>Daftar Putar Berbintang</value>
</data>
<data name="MusicGalleryPageStopTrack.Text" xml:space="preserve"> <data name="MusicGalleryPageStopTrack.Text" xml:space="preserve">
<value>Berhenti</value> <value>Berhenti</value>
</data> </data>
<data name="MusicGalleryPageTitle" xml:space="preserve"> <data name="MusicGalleryPageTitle" xml:space="preserve">
<value>Galeri Musik - BetterLyrics</value> <value>Galeri Musik - BetterLyrics</value>
</data> </data>
<data name="MusicGalleryWindowDownButtonToolTip.Content" xml:space="preserve"> <data name="MusicSettingsControlAutoSyncInterval.Header" xml:space="preserve">
<value>Tarik kembali</value> <value>Frekuensi sinkronisasi otomatis</value>
</data> </data>
<data name="MusicGalleryWindowUpButtonToolTip.Content" xml:space="preserve"> <data name="MusicSettingsControlAutoSyncIntervalDisabled.Content" xml:space="preserve">
<value>Perluas</value> <value>Tidak pernah</value>
</data>
<data name="MusicSettingsControlAutoSyncIntervalEveryDay.Content" xml:space="preserve">
<value>Setiap hari</value>
</data>
<data name="MusicSettingsControlAutoSyncIntervalEveryFifteenMin.Content" xml:space="preserve">
<value>Setiap 15 Menit</value>
</data>
<data name="MusicSettingsControlAutoSyncIntervalEveryHour.Content" xml:space="preserve">
<value>Setiap Jam</value>
</data>
<data name="MusicSettingsControlAutoSyncIntervalEverySixHrs.Content" xml:space="preserve">
<value>Setiap 6 Jam</value>
</data> </data>
<data name="NarrowMode" xml:space="preserve"> <data name="NarrowMode" xml:space="preserve">
<value>Mode Sempit</value> <value>Mode Sempit</value>
@@ -543,12 +555,27 @@
<data name="PrivacyPolicy.Content" xml:space="preserve"> <data name="PrivacyPolicy.Content" xml:space="preserve">
<value>Kebijakan Privasi</value> <value>Kebijakan Privasi</value>
</data> </data>
<data name="RemoteServerConfigControlBrowse.Content" xml:space="preserve">
<value>Jelajahi</value>
</data>
<data name="RemoteServerConfigControlName.Header" xml:space="preserve">
<value>Nama</value>
</data>
<data name="RemoteServerConfigControlName.PlaceholderText" xml:space="preserve">
<value>Membiarkannya kosong akan secara otomatis menghasilkan nama default.</value>
</data>
<data name="RemoteServerConfigControlPassword.Header" xml:space="preserve"> <data name="RemoteServerConfigControlPassword.Header" xml:space="preserve">
<value>Kata Sandi</value> <value>Kata Sandi</value>
</data> </data>
<data name="RemoteServerConfigControlPath.Header" xml:space="preserve"> <data name="RemoteServerConfigControlPath.Header" xml:space="preserve">
<value>Jalur</value> <value>Jalur</value>
</data> </data>
<data name="RemoteServerConfigControlPathNotExisted" xml:space="preserve">
<value>Jalur folder yang ditentukan tidak dapat ditemukan</value>
</data>
<data name="RemoteServerConfigControlPathRequired" xml:space="preserve">
<value>Diperlukan jalur</value>
</data>
<data name="RemoteServerConfigControlPort.Header" xml:space="preserve"> <data name="RemoteServerConfigControlPort.Header" xml:space="preserve">
<value>Port</value> <value>Port</value>
</data> </data>
@@ -576,9 +603,6 @@
<data name="SetingsPageFeedback.Text" xml:space="preserve"> <data name="SetingsPageFeedback.Text" xml:space="preserve">
<value>Umpan Balik</value> <value>Umpan Balik</value>
</data> </data>
<data name="SetingsPageInstructions.Text" xml:space="preserve">
<value>Panduan Penggunaan</value>
</data>
<data name="SetingsPageSpecialThanks.Text" xml:space="preserve"> <data name="SetingsPageSpecialThanks.Text" xml:space="preserve">
<value>Terima Kasih Khusus</value> <value>Terima Kasih Khusus</value>
</data> </data>
@@ -606,9 +630,6 @@
<data name="SettingsPageAddFolderButton.Content" xml:space="preserve"> <data name="SettingsPageAddFolderButton.Content" xml:space="preserve">
<value>Tambah</value> <value>Tambah</value>
</data> </data>
<data name="SettingsPageAdvanced.Text" xml:space="preserve">
<value>Opsi Lanjutan</value>
</data>
<data name="SettingsPageAlbum.Header" xml:space="preserve"> <data name="SettingsPageAlbum.Header" xml:space="preserve">
<value>Album</value> <value>Album</value>
</data> </data>
@@ -624,15 +645,9 @@
<data name="SettingsPageAlbumArtSearchProvidersConfig.Text" xml:space="preserve"> <data name="SettingsPageAlbumArtSearchProvidersConfig.Text" xml:space="preserve">
<value>Konfigurasi Sumber Sampul Album</value> <value>Konfigurasi Sumber Sampul Album</value>
</data> </data>
<data name="SettingsPageAlbumArtSize.Header" xml:space="preserve">
<value>Ukuran Sampul Album</value>
</data>
<data name="SettingsPageAlbumEffect.Text" xml:space="preserve"> <data name="SettingsPageAlbumEffect.Text" xml:space="preserve">
<value>Efek Sampul Album</value> <value>Efek Sampul Album</value>
</data> </data>
<data name="SettingsPageAlbumLib.Content" xml:space="preserve">
<value>Sumber Sampul Album</value>
</data>
<data name="SettingsPageAlbumRadius.Header" xml:space="preserve"> <data name="SettingsPageAlbumRadius.Header" xml:space="preserve">
<value>Radius Sudut</value> <value>Radius Sudut</value>
</data> </data>
@@ -663,12 +678,6 @@
<data name="SettingsPageAppAppearance.Text" xml:space="preserve"> <data name="SettingsPageAppAppearance.Text" xml:space="preserve">
<value>Tampilan Aplikasi</value> <value>Tampilan Aplikasi</value>
</data> </data>
<data name="SettingsPageAppBehavior.Text" xml:space="preserve">
<value>Perilaku Umum</value>
</data>
<data name="SettingsPageApply.Content" xml:space="preserve">
<value>Terapkan</value>
</data>
<data name="SettingsPageArtist.Header" xml:space="preserve"> <data name="SettingsPageArtist.Header" xml:space="preserve">
<value>Artis</value> <value>Artis</value>
</data> </data>
@@ -687,23 +696,14 @@
<data name="SettingsPageAutoStart.Header" xml:space="preserve"> <data name="SettingsPageAutoStart.Header" xml:space="preserve">
<value>Mulai Otomatis</value> <value>Mulai Otomatis</value>
</data> </data>
<data name="SettingsPageAutoStartWindow.Header" xml:space="preserve">
<value>Saat memulai aplikasi</value>
</data>
<data name="SettingsPageBackdrop.Header" xml:space="preserve">
<value>Material Latar Belakang Lirik</value>
</data>
<data name="SettingsPageBackgroundOverlay.Text" xml:space="preserve"> <data name="SettingsPageBackgroundOverlay.Text" xml:space="preserve">
<value>Latar Belakang Lirik</value> <value>Latar Belakang Lirik</value>
</data> </data>
<data name="SettingsPageBlurAmount.Header" xml:space="preserve"> <data name="SettingsPageBlurAmount.Header" xml:space="preserve">
<value>Tingkat Keburaman</value> <value>Tingkat Keburaman</value>
</data> </data>
<data name="SettingsPageBorderless.Header" xml:space="preserve">
<value>Jendela Tanpa Batas</value>
</data>
<data name="SettingsPageCache.Description" xml:space="preserve"> <data name="SettingsPageCache.Description" xml:space="preserve">
<value>Termasuk file log, cache lirik jaringan</value> <value>Termasuk file log, cache lirik online</value>
</data> </data>
<data name="SettingsPageCache.Header" xml:space="preserve"> <data name="SettingsPageCache.Header" xml:space="preserve">
<value>Cache</value> <value>Cache</value>
@@ -738,9 +738,6 @@
<data name="SettingsPageCollapseDropdown.Content" xml:space="preserve"> <data name="SettingsPageCollapseDropdown.Content" xml:space="preserve">
<value>Ciutkan Dropdown</value> <value>Ciutkan Dropdown</value>
</data> </data>
<data name="SettingsPageCompactTitleBar.Content" xml:space="preserve">
<value>Kompak</value>
</data>
<data name="SettingsPageConfigName.Description" xml:space="preserve"> <data name="SettingsPageConfigName.Description" xml:space="preserve">
<value>Menamai status jendela yang direkam dapat membantu Anda membedakannya dengan lebih baik</value> <value>Menamai status jendela yang direkam dapat membantu Anda membedakannya dengan lebih baik</value>
</data> </data>
@@ -759,18 +756,12 @@
<data name="SettingsPageCrossfade.Content" xml:space="preserve"> <data name="SettingsPageCrossfade.Content" xml:space="preserve">
<value>Crossfade</value> <value>Crossfade</value>
</data> </data>
<data name="SettingsPageCurrentLyricsWindowStatus.Text" xml:space="preserve">
<value>Status Jendela Lirik Saat Ini</value>
</data>
<data name="SettingsPageCutletDockerServer.Header" xml:space="preserve"> <data name="SettingsPageCutletDockerServer.Header" xml:space="preserve">
<value>Layanan Transliterasi cutlet-docker</value> <value>Layanan Transliterasi cutlet-docker</value>
</data> </data>
<data name="SettingsPageDark.Content" xml:space="preserve"> <data name="SettingsPageDark.Content" xml:space="preserve">
<value>Gelap</value> <value>Gelap</value>
</data> </data>
<data name="SettingsPageDebugOverlay.Header" xml:space="preserve">
<value>Tampilkan Overlay Debug</value>
</data>
<data name="SettingsPageDelete.Text" xml:space="preserve"> <data name="SettingsPageDelete.Text" xml:space="preserve">
<value>Hapus</value> <value>Hapus</value>
</data> </data>
@@ -801,15 +792,9 @@
<data name="SettingsPageDockPlacementTop.Content" xml:space="preserve"> <data name="SettingsPageDockPlacementTop.Content" xml:space="preserve">
<value>Atas</value> <value>Atas</value>
</data> </data>
<data name="SettingsPageDockWindowHeight.Header" xml:space="preserve">
<value>Tinggi Jendela</value>
</data>
<data name="SettingsPageDragArea.Header" xml:space="preserve"> <data name="SettingsPageDragArea.Header" xml:space="preserve">
<value>Area yang Dapat Diseret</value> <value>Area yang Dapat Diseret</value>
</data> </data>
<data name="SettingsPageEasingFuncType.Header" xml:space="preserve">
<value>Jenis Animasi Easing</value>
</data>
<data name="SettingsPageEasingTypeEaseInOutBack.Content" xml:space="preserve"> <data name="SettingsPageEasingTypeEaseInOutBack.Content" xml:space="preserve">
<value>EaseInOutBack</value> <value>EaseInOutBack</value>
</data> </data>
@@ -873,18 +858,15 @@
<data name="SettingsPageExitOnLyricsWindowClosed.Header" xml:space="preserve"> <data name="SettingsPageExitOnLyricsWindowClosed.Header" xml:space="preserve">
<value>Keluar dari program saat jendela lirik ditutup</value> <value>Keluar dari program saat jendela lirik ditutup</value>
</data> </data>
<data name="SettingsPageExportPlayHistoryButton.Content" xml:space="preserve">
<value>Riwayat permainan ekspor</value>
</data>
<data name="SettingsPageExportSettingsButton.Content" xml:space="preserve"> <data name="SettingsPageExportSettingsButton.Content" xml:space="preserve">
<value>Ekspor Pengaturan</value> <value>Ekspor Pengaturan</value>
</data> </data>
<data name="SettingsPageExtendedTitleBar.Content" xml:space="preserve">
<value>Diperluas</value>
</data>
<data name="SettingsPageFan.Header" xml:space="preserve"> <data name="SettingsPageFan.Header" xml:space="preserve">
<value>Lirik Kipas</value> <value>Lirik Kipas</value>
</data> </data>
<data name="SettingsPageFAQ.Content" xml:space="preserve">
<value>FAQ</value>
</data>
<data name="SettingsPageFixedTimeStep.Header" xml:space="preserve"> <data name="SettingsPageFixedTimeStep.Header" xml:space="preserve">
<value>Rendering Langkah Waktu Tetap</value> <value>Rendering Langkah Waktu Tetap</value>
</data> </data>
@@ -921,9 +903,6 @@
<data name="SettingsPageHeight.Header" xml:space="preserve"> <data name="SettingsPageHeight.Header" xml:space="preserve">
<value>Tinggi</value> <value>Tinggi</value>
</data> </data>
<data name="SettingsPageHello.Text" xml:space="preserve">
<value>Halo</value>
</data>
<data name="SettingsPageHelpUsTranslate.Content" xml:space="preserve"> <data name="SettingsPageHelpUsTranslate.Content" xml:space="preserve">
<value>Bantu kami menerjemahkan aplikasi ini</value> <value>Bantu kami menerjemahkan aplikasi ini</value>
</data> </data>
@@ -954,9 +933,6 @@
<data name="SettingsPageJapanese.Header" xml:space="preserve"> <data name="SettingsPageJapanese.Header" xml:space="preserve">
<value>Fonetik Bahasa Jepang</value> <value>Fonetik Bahasa Jepang</value>
</data> </data>
<data name="SettingsPageJoinNowButton.Content" xml:space="preserve">
<value>Gabung Sekarang</value>
</data>
<data name="SettingsPageJyutping.Content" xml:space="preserve"> <data name="SettingsPageJyutping.Content" xml:space="preserve">
<value>Jyutping (Kanton)</value> <value>Jyutping (Kanton)</value>
</data> </data>
@@ -1005,18 +981,12 @@
<data name="SettingsPageLight.Content" xml:space="preserve"> <data name="SettingsPageLight.Content" xml:space="preserve">
<value>Terang</value> <value>Terang</value>
</data> </data>
<data name="SettingsPageLinkedFile.Text" xml:space="preserve">
<value>File Lokal Tertaut</value>
</data>
<data name="SettingsPageListenNewSession.Header" xml:space="preserve"> <data name="SettingsPageListenNewSession.Header" xml:space="preserve">
<value>Aktifkan mendengarkan sumber pemutaran baru</value> <value>Aktifkan mendengarkan sumber pemutaran baru</value>
</data> </data>
<data name="SettingsPageLocalFolder.Text" xml:space="preserve"> <data name="SettingsPageLocalFolder.Text" xml:space="preserve">
<value>Folder Lokal</value> <value>Folder Lokal</value>
</data> </data>
<data name="SettingsPageLog.Header" xml:space="preserve">
<value>Pencatatan (Logging)</value>
</data>
<data name="SettingsPageLongSyllableDuration.Header" xml:space="preserve"> <data name="SettingsPageLongSyllableDuration.Header" xml:space="preserve">
<value>Ambang Batas Suku Kata Panjang</value> <value>Ambang Batas Suku Kata Panjang</value>
</data> </data>
@@ -1071,15 +1041,6 @@
<data name="SettingsPageLyricsFgFontColor.Header" xml:space="preserve"> <data name="SettingsPageLyricsFgFontColor.Header" xml:space="preserve">
<value>Baris Saat Ini</value> <value>Baris Saat Ini</value>
</data> </data>
<data name="SettingsPageLyricsFgFontColorAdaptiveColored.Content" xml:space="preserve">
<value>Adaptif terhadap Latar Belakang Lirik (Berwarna)</value>
</data>
<data name="SettingsPageLyricsFgFontColorAdaptiveGrayed.Content" xml:space="preserve">
<value>Adaptif terhadap Latar Belakang Lirik (Abu-abu)</value>
</data>
<data name="SettingsPageLyricsFgFontColorCustom.Content" xml:space="preserve">
<value>Kustom</value>
</data>
<data name="SettingsPageLyricsFloatAnimation.Header" xml:space="preserve"> <data name="SettingsPageLyricsFloatAnimation.Header" xml:space="preserve">
<value>Animasi Mengambang</value> <value>Animasi Mengambang</value>
</data> </data>
@@ -1107,27 +1068,12 @@
<data name="SettingsPageLyricsGlowEffect.Header" xml:space="preserve"> <data name="SettingsPageLyricsGlowEffect.Header" xml:space="preserve">
<value>Efek Bersinar</value> <value>Efek Bersinar</value>
</data> </data>
<data name="SettingsPageLyricsHighlight.Header" xml:space="preserve">
<value>Sorot</value>
</data>
<data name="SettingsPageLyricsHighlightScope.Header" xml:space="preserve">
<value>Cakupan Penyorotan Teks Asli</value>
</data>
<data name="SettingsPageLyricsLeft.Content" xml:space="preserve">
<value>Kiri</value>
</data>
<data name="SettingsPageLyricsLight.Content" xml:space="preserve"> <data name="SettingsPageLyricsLight.Content" xml:space="preserve">
<value>Tipis</value> <value>Tipis</value>
</data> </data>
<data name="SettingsPageLyricsLineFade.Header" xml:space="preserve">
<value>Gradien Tepi Area Pemutaran</value>
</data>
<data name="SettingsPageLyricsLineSpacingFactor.Header" xml:space="preserve"> <data name="SettingsPageLyricsLineSpacingFactor.Header" xml:space="preserve">
<value>Spasi Baris</value> <value>Spasi Baris</value>
</data> </data>
<data name="SettingsPageLyricsLineSpacingFactorUnit.Text" xml:space="preserve">
<value> kali tinggi baris</value>
</data>
<data name="SettingsPageLyricsMedium.Content" xml:space="preserve"> <data name="SettingsPageLyricsMedium.Content" xml:space="preserve">
<value>Sedang</value> <value>Sedang</value>
</data> </data>
@@ -1170,9 +1116,6 @@
<data name="SettingsPageLyricsSemiLight.Content" xml:space="preserve"> <data name="SettingsPageLyricsSemiLight.Content" xml:space="preserve">
<value>Semi Tipis</value> <value>Semi Tipis</value>
</data> </data>
<data name="SettingsPageLyricsShadow.Header" xml:space="preserve">
<value>Bayangan</value>
</data>
<data name="SettingsPageLyricsStyle.Text" xml:space="preserve"> <data name="SettingsPageLyricsStyle.Text" xml:space="preserve">
<value>Gaya Lirik</value> <value>Gaya Lirik</value>
</data> </data>
@@ -1188,30 +1131,15 @@
<data name="SettingsPageLyricsTimelineThreshold.Header" xml:space="preserve"> <data name="SettingsPageLyricsTimelineThreshold.Header" xml:space="preserve">
<value>Ambang Sinkronisasi Waktu Lirik</value> <value>Ambang Sinkronisasi Waktu Lirik</value>
</data> </data>
<data name="SettingsPageLyricsTranslationHighlight.Header" xml:space="preserve">
<value>Sorotan Terjemahan</value>
</data>
<data name="SettingsPageLyricsTranslationSeparator.Header" xml:space="preserve">
<value>Pemisah Teks Asli dan Terjemahan</value>
</data>
<data name="SettingsPageLyricsVerticalEdgeOpacity.Header" xml:space="preserve">
<value>Opasitas Tepi Vertikal</value>
</data>
<data name="SettingsPageLyricsWindow.Text" xml:space="preserve"> <data name="SettingsPageLyricsWindow.Text" xml:space="preserve">
<value>Jendela Lirik</value> <value>Jendela Lirik</value>
</data> </data>
<data name="SettingsPageLyricsWindowManager.Text" xml:space="preserve">
<value>Manajer Jendela Lirik</value>
</data>
<data name="SettingsPageLyricsWindowMgr.Content" xml:space="preserve"> <data name="SettingsPageLyricsWindowMgr.Content" xml:space="preserve">
<value>Manajer Jendela Lirik</value> <value>Manajer Jendela Lirik</value>
</data> </data>
<data name="SettingsPageLyricsWindowSwitchHotKey.Header" xml:space="preserve"> <data name="SettingsPageLyricsWindowSwitchHotKey.Header" xml:space="preserve">
<value>Pintasan Pengalih Status Jendela Lirik</value> <value>Pintasan Pengalih Status Jendela Lirik</value>
</data> </data>
<data name="SettingsPageLyricsWindowToolTip.Content" xml:space="preserve">
<value>Jendela Lirik</value>
</data>
<data name="SettingsPageMatchingThreshold.Description" xml:space="preserve"> <data name="SettingsPageMatchingThreshold.Description" xml:space="preserve">
<value>Menyesuaikan nilai ini akan memengaruhi hasil pencarian berurutan dan pencarian kecocokan terbaik, tetapi tidak akan memengaruhi hasil pencarian di antarmuka pencarian manual lirik</value> <value>Menyesuaikan nilai ini akan memengaruhi hasil pencarian berurutan dan pencarian kecocokan terbaik, tetapi tidak akan memengaruhi hasil pencarian di antarmuka pencarian manual lirik</value>
</data> </data>
@@ -1248,18 +1176,12 @@
<data name="SettingsPageMusicLib.Header" xml:space="preserve"> <data name="SettingsPageMusicLib.Header" xml:space="preserve">
<value>Pustaka Media Lokal</value> <value>Pustaka Media Lokal</value>
</data> </data>
<data name="SettingsPageMusicLibRealTimeWatch.Header" xml:space="preserve">
<value>Pemantauan Perubahan File Secara Real-time</value>
</data>
<data name="SettingsPageNarrowMode.Text" xml:space="preserve"> <data name="SettingsPageNarrowMode.Text" xml:space="preserve">
<value>Mode Sempit</value> <value>Mode Sempit</value>
</data> </data>
<data name="SettingsPageNextSongHotKey.Header" xml:space="preserve"> <data name="SettingsPageNextSongHotKey.Header" xml:space="preserve">
<value>Pintasan Lagu Berikutnya</value> <value>Pintasan Lagu Berikutnya</value>
</data> </data>
<data name="SettingsPageNoBackdrop.Content" xml:space="preserve">
<value>Tidak Ada</value>
</data>
<data name="SettingsPageOctTree.Content" xml:space="preserve"> <data name="SettingsPageOctTree.Content" xml:space="preserve">
<value>Agresif</value> <value>Agresif</value>
</data> </data>
@@ -1287,9 +1209,6 @@
<data name="SettingsPagePathIncludingOthersInfo" xml:space="preserve"> <data name="SettingsPagePathIncludingOthersInfo" xml:space="preserve">
<value>Folder ini berisi folder yang sudah ditambahkan, harap hapus folder tersebut untuk menambahkan folder ini</value> <value>Folder ini berisi folder yang sudah ditambahkan, harap hapus folder tersebut untuk menambahkan folder ini</value>
</data> </data>
<data name="SettingsPagePathNotFound.Text" xml:space="preserve">
<value>Tidak dapat menemukan jalur di komputer Anda</value>
</data>
<data name="SettingsPagePatrons.Text" xml:space="preserve"> <data name="SettingsPagePatrons.Text" xml:space="preserve">
<value>Sponsor</value> <value>Sponsor</value>
</data> </data>
@@ -1335,15 +1254,9 @@
<data name="SettingsPageRealtimeStatus.Text" xml:space="preserve"> <data name="SettingsPageRealtimeStatus.Text" xml:space="preserve">
<value>Status Waktu Nyata</value> <value>Status Waktu Nyata</value>
</data> </data>
<data name="SettingsPageRecord.Content" xml:space="preserve">
<value>Rekam</value>
</data>
<data name="SettingsPageRecordedWindowStatus.Text" xml:space="preserve"> <data name="SettingsPageRecordedWindowStatus.Text" xml:space="preserve">
<value>Status Jendela yang Direkam</value> <value>Status Jendela yang Direkam</value>
</data> </data>
<data name="SettingsPageReference.Header" xml:space="preserve">
<value>Tautan Referensi</value>
</data>
<data name="SettingsPageRefreshDropdown.Content" xml:space="preserve"> <data name="SettingsPageRefreshDropdown.Content" xml:space="preserve">
<value>Segarkan Dropdown</value> <value>Segarkan Dropdown</value>
</data> </data>
@@ -1362,9 +1275,6 @@
<data name="SettingsPageRight.Content" xml:space="preserve"> <data name="SettingsPageRight.Content" xml:space="preserve">
<value>Kanan</value> <value>Kanan</value>
</data> </data>
<data name="SettingsPageRomaji.Header" xml:space="preserve">
<value>Fonetik Bahasa Jepang</value>
</data>
<data name="SettingsPageScope.Header" xml:space="preserve"> <data name="SettingsPageScope.Header" xml:space="preserve">
<value>Cakupan</value> <value>Cakupan</value>
</data> </data>
@@ -1404,6 +1314,9 @@
<data name="SettingsPageSettingsManager.Header" xml:space="preserve"> <data name="SettingsPageSettingsManager.Header" xml:space="preserve">
<value>Manajer Pengaturan</value> <value>Manajer Pengaturan</value>
</data> </data>
<data name="SettingsPageSettingsPlayHistory.Header" xml:space="preserve">
<value>Riwayat Bermain</value>
</data>
<data name="SettingsPageShareHub.Content" xml:space="preserve"> <data name="SettingsPageShareHub.Content" xml:space="preserve">
<value>Jelajahi Hub Berbagi Sumber Daya Online</value> <value>Jelajahi Hub Berbagi Sumber Daya Online</value>
</data> </data>
@@ -1431,18 +1344,12 @@
<data name="SettingsPageShowInSwitchers.Header" xml:space="preserve"> <data name="SettingsPageShowInSwitchers.Header" xml:space="preserve">
<value>Tampilkan di Lingkungan Sistem</value> <value>Tampilkan di Lingkungan Sistem</value>
</data> </data>
<data name="SettingsPageShowLayoutDragger.Header" xml:space="preserve">
<value>Tampilkan Pemisah Tata Letak</value>
</data>
<data name="SettingsPageShowTitle.Header" xml:space="preserve"> <data name="SettingsPageShowTitle.Header" xml:space="preserve">
<value>Tampilkan Judul</value> <value>Tampilkan Judul</value>
</data> </data>
<data name="SettingsPageSlide.Content" xml:space="preserve"> <data name="SettingsPageSlide.Content" xml:space="preserve">
<value>Geser</value> <value>Geser</value>
</data> </data>
<data name="SettingsPageSliderPrefix.Text" xml:space="preserve">
<value>Nilai saat ini: </value>
</data>
<data name="SettingsPageSnowFlakeLayer.Header" xml:space="preserve"> <data name="SettingsPageSnowFlakeLayer.Header" xml:space="preserve">
<value>Lapisan Kepingan Salju</value> <value>Lapisan Kepingan Salju</value>
</data> </data>
@@ -1485,6 +1392,9 @@
<data name="SettingsPageStartup.Text" xml:space="preserve"> <data name="SettingsPageStartup.Text" xml:space="preserve">
<value>Startup</value> <value>Startup</value>
</data> </data>
<data name="SettingsPageStats.Content" xml:space="preserve">
<value>Statistik</value>
</data>
<data name="SettingsPageStopTrackOnGalleryWindowClosed.Header" xml:space="preserve"> <data name="SettingsPageStopTrackOnGalleryWindowClosed.Header" xml:space="preserve">
<value>Hentikan pemutaran saat jendela galeri musik ditutup</value> <value>Hentikan pemutaran saat jendela galeri musik ditutup</value>
</data> </data>
@@ -1503,9 +1413,6 @@
<data name="SettingsPageTaskbarPlacement.Header" xml:space="preserve"> <data name="SettingsPageTaskbarPlacement.Header" xml:space="preserve">
<value>Posisi Pemasangan Bilah Tugas</value> <value>Posisi Pemasangan Bilah Tugas</value>
</data> </data>
<data name="SettingsPageThanksForPurchasing.Text" xml:space="preserve">
<value>Terima kasih telah membeli BetterLyrics</value>
</data>
<data name="SettingsPageThanksList.Header" xml:space="preserve"> <data name="SettingsPageThanksList.Header" xml:space="preserve">
<value>Daftar Ucapan Terima Kasih</value> <value>Daftar Ucapan Terima Kasih</value>
</data> </data>
@@ -1524,12 +1431,6 @@
<data name="SettingsPageTitleBarAreaWhole.Content" xml:space="preserve"> <data name="SettingsPageTitleBarAreaWhole.Content" xml:space="preserve">
<value>Seluruh Jendela</value> <value>Seluruh Jendela</value>
</data> </data>
<data name="SettingsPageTitleBarType.Header" xml:space="preserve">
<value>Ukuran Bilah Judul</value>
</data>
<data name="SettingsPageToggleHotKey.Header" xml:space="preserve">
<value>Pintasan Masuk dan Keluar (Cut-in/out)</value>
</data>
<data name="SettingsPageTranslatedText.Header" xml:space="preserve"> <data name="SettingsPageTranslatedText.Header" xml:space="preserve">
<value>Terjemahan</value> <value>Terjemahan</value>
</data> </data>
@@ -1539,9 +1440,6 @@
<data name="SettingsPageTranslationConfig.Header" xml:space="preserve"> <data name="SettingsPageTranslationConfig.Header" xml:space="preserve">
<value>Layanan Terjemahan LibreTranslate</value> <value>Layanan Terjemahan LibreTranslate</value>
</data> </data>
<data name="SettingsPageTranslationInfoLink.Text" xml:space="preserve">
<value>Kunjungi https://github.com/LibreTranslate/LibreTranslate untuk tutorial instalasi dan info lebih lanjut (perangkat lunak ini tidak memiliki afiliasi dengan layanan terjemahan tersebut)</value>
</data>
<data name="SettingsPageUserWhoPurchased.Text" xml:space="preserve"> <data name="SettingsPageUserWhoPurchased.Text" xml:space="preserve">
<value>dan pengguna yang membeli serta mendukung BetterLyrics</value> <value>dan pengguna yang membeli serta mendukung BetterLyrics</value>
</data> </data>
@@ -1554,9 +1452,6 @@
<data name="SettingsPageWidth.Header" xml:space="preserve"> <data name="SettingsPageWidth.Header" xml:space="preserve">
<value>Lebar</value> <value>Lebar</value>
</data> </data>
<data name="SettingsPageWindowBounds.Header" xml:space="preserve">
<value>Batas Jendela</value>
</data>
<data name="SettingsPageWorkArea.Description" xml:space="preserve"> <data name="SettingsPageWorkArea.Description" xml:space="preserve">
<value>Sebagai ruang kerja terpisah, dipasang di tepi atas/bawah layar</value> <value>Sebagai ruang kerja terpisah, dipasang di tepi atas/bawah layar</value>
</data> </data>
@@ -1572,6 +1467,39 @@
<data name="StandardMode" xml:space="preserve"> <data name="StandardMode" xml:space="preserve">
<value>Mode Standar</value> <value>Mode Standar</value>
</data> </data>
<data name="StatsDashboardControlSources.Text" xml:space="preserve">
<value>Sumber</value>
</data>
<data name="StatsDashboardControlThisMonth.Header" xml:space="preserve">
<value>Bulan ini</value>
</data>
<data name="StatsDashboardControlThisQuarter.Header" xml:space="preserve">
<value>Kuartal ini</value>
</data>
<data name="StatsDashboardControlThisWeek.Header" xml:space="preserve">
<value>Minggu Ini</value>
</data>
<data name="StatsDashboardControlThisYear.Header" xml:space="preserve">
<value>Tahun ini</value>
</data>
<data name="StatsDashboardControlToday.Header" xml:space="preserve">
<value>Hari ini</value>
</data>
<data name="StatsDashboardControlTopArtists.Text" xml:space="preserve">
<value>Artis Top</value>
</data>
<data name="StatsDashboardControlTopSongs.Text" xml:space="preserve">
<value>Trek Teratas</value>
</data>
<data name="StatsDashboardControlTopSource.Text" xml:space="preserve">
<value>Sumber Teratas</value>
</data>
<data name="StatsDashboardControlTotalDuration.Text" xml:space="preserve">
<value>Total Durasi</value>
</data>
<data name="StatsDashboardControlTracksPlayed.Text" xml:space="preserve">
<value>Lagu yang Dimainkan</value>
</data>
<data name="SystemTrayExit.Text" xml:space="preserve"> <data name="SystemTrayExit.Text" xml:space="preserve">
<value>Keluar dari Program</value> <value>Keluar dari Program</value>
</data> </data>
@@ -1581,9 +1509,6 @@
<data name="SystemTrayMusicGallery.Text" xml:space="preserve"> <data name="SystemTrayMusicGallery.Text" xml:space="preserve">
<value>Buka Galeri Musik</value> <value>Buka Galeri Musik</value>
</data> </data>
<data name="SystemTrayPageTitle" xml:space="preserve">
<value>Baki Sistem - BetterLyrics</value>
</data>
<data name="SystemTrayResetWindowPosition.Text" xml:space="preserve"> <data name="SystemTrayResetWindowPosition.Text" xml:space="preserve">
<value>Atur Ulang Posisi Jendela</value> <value>Atur Ulang Posisi Jendela</value>
</data> </data>

View File

@@ -129,21 +129,12 @@
<data name="AlbumArtSearchSMTCProvider" xml:space="preserve"> <data name="AlbumArtSearchSMTCProvider" xml:space="preserve">
<value>음악 플레이어</value> <value>음악 플레이어</value>
</data> </data>
<data name="AllLyricsSettingsControlPictureInPicture.Content" xml:space="preserve">
<value>PIP 모드 (화면 속 화면)</value>
</data>
<data name="AppSettingsControlGeneral.Text" xml:space="preserve"> <data name="AppSettingsControlGeneral.Text" xml:space="preserve">
<value>창</value> <value>창</value>
</data> </data>
<data name="ArtistsSplitHint.Text" xml:space="preserve"> <data name="ArtistsSplitHint.Text" xml:space="preserve">
<value>여러 아티스트를 입력할 때는 다음 구분 기호 중 하나를 사용하여 구분해 주세요 (혼용 금지)</value> <value>여러 아티스트를 입력할 때는 다음 구분 기호 중 하나를 사용하여 구분해 주세요 (혼용 금지)</value>
</data> </data>
<data name="BaseWindowHostInfoBarCheckBox.Content" xml:space="preserve">
<value>이 메시지를 다시 표시하지 않음</value>
</data>
<data name="BaseWindowMiniFlyoutItem.Text" xml:space="preserve">
<value>PIP 모드</value>
</data>
<data name="Cancel" xml:space="preserve"> <data name="Cancel" xml:space="preserve">
<value>취소</value> <value>취소</value>
</data> </data>
@@ -168,24 +159,45 @@
<data name="DockedMode" xml:space="preserve"> <data name="DockedMode" xml:space="preserve">
<value>도킹 모드</value> <value>도킹 모드</value>
</data> </data>
<data name="Error" xml:space="preserve">
<value>오류</value>
</data>
<data name="ExportSettingsSuccess" xml:space="preserve"> <data name="ExportSettingsSuccess" xml:space="preserve">
<value>내보내기 성공</value> <value>내보내기 성공</value>
</data> </data>
<data name="FailToStartLXMusicServer" xml:space="preserve"> <data name="FailToStartLXMusicServer" xml:space="preserve">
<value>LX Music 서버에 연결할 수 없습니다. 설정 - 재생 소스 - LX Music - LX Music 서버에서 링크가 올바르게 입력되었는지 확인하세요</value> <value>LX Music 서버에 연결할 수 없습니다. 설정 - 재생 소스 - LX Music - LX Music 서버에서 링크가 올바르게 입력되었는지 확인하세요</value>
</data> </data>
<data name="FileSystemServiceCleaningCache" xml:space="preserve">
<value>캐시 정리...</value>
</data>
<data name="FileSystemServiceConnectFailed" xml:space="preserve">
<value>연결 실패</value>
</data>
<data name="FileSystemServiceConnecting" xml:space="preserve">
<value>연결 중...</value>
</data>
<data name="FileSystemServiceFetchingFileList" xml:space="preserve">
<value>파일 목록 가져오기...</value>
</data>
<data name="FileSystemServiceParsing" xml:space="preserve">
<value>파싱...</value>
</data>
<data name="FileSystemServicePrepareToClean" xml:space="preserve">
<value>캐시 정리 준비 중...</value>
</data>
<data name="FileSystemServiceReady" xml:space="preserve">
<value>준비</value>
</data>
<data name="FileSystemServiceRootDirectoryWarning" xml:space="preserve">
<value>루트 디렉터리 경로가 감지되었습니다. 전체 디스크 인덱스에 미디어가 아닌 파일이 많이 포함되어 있어 스캔 시간이 너무 오래 걸릴 수 있습니다. 특정 하위 디렉터리를 지정하는 것이 좋습니다.</value>
</data>
<data name="FileSystemServiceWaitingForScan" xml:space="preserve">
<value>스캔 대기 중...</value>
</data>
<data name="FullscreenMode" xml:space="preserve"> <data name="FullscreenMode" xml:space="preserve">
<value>전체 화면 모드</value> <value>전체 화면 모드</value>
</data> </data>
<data name="HostWindowClickThroughButton.Content" xml:space="preserve">
<value>잠금</value>
</data>
<data name="HostWindowClickThroughFlyoutItem.Text" xml:space="preserve">
<value>잠금</value>
</data>
<data name="HostWindowLockToolTip.Text" xml:space="preserve">
<value>잠금</value>
</data>
<data name="HostWindowMusicGalleryButtonToolTip.Content" xml:space="preserve"> <data name="HostWindowMusicGalleryButtonToolTip.Content" xml:space="preserve">
<value>음악 갤러리</value> <value>음악 갤러리</value>
</data> </data>
@@ -204,9 +216,6 @@
<data name="Jyutping" xml:space="preserve"> <data name="Jyutping" xml:space="preserve">
<value>Jyutping (광동어)</value> <value>Jyutping (광동어)</value>
</data> </data>
<data name="KeepAtLeastOneStatusDefault" xml:space="preserve">
<value>최소 하나의 상태를 기본값으로 설정해야 합니다</value>
</data>
<data name="LastFMAuthFailed" xml:space="preserve"> <data name="LastFMAuthFailed" xml:space="preserve">
<value>인증 실패, 다시 시도해 주세요</value> <value>인증 실패, 다시 시도해 주세요</value>
</data> </data>
@@ -270,18 +279,12 @@
<data name="LyricsPageSettings.Text" xml:space="preserve"> <data name="LyricsPageSettings.Text" xml:space="preserve">
<value>설정</value> <value>설정</value>
</data> </data>
<data name="LyricsPageTimelineOffsetButtonToolTip.Content" xml:space="preserve">
<value>가사 타임라인 오프셋</value>
</data>
<data name="LyricsPageTranslationEnabled.Description" xml:space="preserve"> <data name="LyricsPageTranslationEnabled.Description" xml:space="preserve">
<value>가사 내 번역을 우선 읽고, 일치하는 것이 없으면 LibreTranslate 서버에 기계 번역을 요청합니다</value> <value>가사 내 번역을 우선 읽고, 일치하는 것이 없으면 LibreTranslate 서버에 기계 번역을 요청합니다</value>
</data> </data>
<data name="LyricsPageTranslationEnabled.Header" xml:space="preserve"> <data name="LyricsPageTranslationEnabled.Header" xml:space="preserve">
<value>번역 활성화</value> <value>번역 활성화</value>
</data> </data>
<data name="LyricsPageTranslationOnly.Header" xml:space="preserve">
<value>번역만 표시</value>
</data>
<data name="LyricsPageTranslationProviderPrefix.Header" xml:space="preserve"> <data name="LyricsPageTranslationProviderPrefix.Header" xml:space="preserve">
<value>번역 제공자</value> <value>번역 제공자</value>
</data> </data>
@@ -330,9 +333,6 @@
<data name="LyricsSearchControlSongInfoMapping.Text" xml:space="preserve"> <data name="LyricsSearchControlSongInfoMapping.Text" xml:space="preserve">
<value>곡 정보 매핑</value> <value>곡 정보 매핑</value>
</data> </data>
<data name="LyricsSearchControlTargetSearchProvider.Header" xml:space="preserve">
<value>대상 가사 검색 제공자</value>
</data>
<data name="LyricsSearchControlTitle.Header" xml:space="preserve"> <data name="LyricsSearchControlTitle.Header" xml:space="preserve">
<value>제목</value> <value>제목</value>
</data> </data>
@@ -351,15 +351,9 @@
<data name="LyricsSearchProviderTtmlFile" xml:space="preserve"> <data name="LyricsSearchProviderTtmlFile" xml:space="preserve">
<value>로컬 .TTML 파일</value> <value>로컬 .TTML 파일</value>
</data> </data>
<data name="LyricsWindowImmersiveButtonToolTip.Content" xml:space="preserve">
<value>몰입 모드</value>
</data>
<data name="LyricsWindowSettingsControlLyricsWindowConfig.Text" xml:space="preserve"> <data name="LyricsWindowSettingsControlLyricsWindowConfig.Text" xml:space="preserve">
<value>구성</value> <value>구성</value>
</data> </data>
<data name="LyricsWindowSettingsControlLyricsWindowMode.Header" xml:space="preserve">
<value>가사 창 모드</value>
</data>
<data name="LyricsWindowSettingsControlSetDefault.Text" xml:space="preserve"> <data name="LyricsWindowSettingsControlSetDefault.Text" xml:space="preserve">
<value>기본값으로 설정</value> <value>기본값으로 설정</value>
</data> </data>
@@ -378,9 +372,6 @@
<data name="MainPageAlbumArtOnly.Content" xml:space="preserve"> <data name="MainPageAlbumArtOnly.Content" xml:space="preserve">
<value>앨범 아트 영역만 표시</value> <value>앨범 아트 영역만 표시</value>
</data> </data>
<data name="MainPageEnterImmersiveModeHint" xml:space="preserve">
<value>다시 호버하여 전환 버튼 표시</value>
</data>
<data name="MainPageLyriscOnly.Content" xml:space="preserve"> <data name="MainPageLyriscOnly.Content" xml:space="preserve">
<value>가사만 표시</value> <value>가사만 표시</value>
</data> </data>
@@ -396,6 +387,18 @@
<data name="MainPageSplitView.Content" xml:space="preserve"> <data name="MainPageSplitView.Content" xml:space="preserve">
<value>분할 보기</value> <value>분할 보기</value>
</data> </data>
<data name="MediaSettingsControlLastSyncTime.Header" xml:space="preserve">
<value>마지막 동기화 시간</value>
</data>
<data name="MediaSettingsControlLocalFolder" xml:space="preserve">
<value>로컬 폴더</value>
</data>
<data name="MediaSettingsControlNameSetting.Header" xml:space="preserve">
<value>이름</value>
</data>
<data name="MediaSettingsControlSyncNow.Content" xml:space="preserve">
<value>지금 동기화</value>
</data>
<data name="MusicGalleryPageAddToCustomList.Text" xml:space="preserve"> <data name="MusicGalleryPageAddToCustomList.Text" xml:space="preserve">
<value>재생 목록에 추가</value> <value>재생 목록에 추가</value>
</data> </data>
@@ -411,6 +414,12 @@
<data name="MusicGalleryPageAllSongs" xml:space="preserve"> <data name="MusicGalleryPageAllSongs" xml:space="preserve">
<value>모든 음악</value> <value>모든 음악</value>
</data> </data>
<data name="MusicGalleryPageDataSync.Message" xml:space="preserve">
<value>미디어 라이브러리 동기화 진행 중...</value>
</data>
<data name="MusicGalleryPageDataSyncError.Message" xml:space="preserve">
<value>미디어 라이브러리 동기화에 문제가 있습니다.</value>
</data>
<data name="MusicGalleryPageEmptyPlayingQueue.Text" xml:space="preserve"> <data name="MusicGalleryPageEmptyPlayingQueue.Text" xml:space="preserve">
<value>재생 대기열 비우기</value> <value>재생 대기열 비우기</value>
</data> </data>
@@ -420,9 +429,6 @@
<data name="MusicGalleryPageFileArtist.Header" xml:space="preserve"> <data name="MusicGalleryPageFileArtist.Header" xml:space="preserve">
<value>아티스트</value> <value>아티스트</value>
</data> </data>
<data name="MusicGalleryPageFileInfo.Text" xml:space="preserve">
<value>파일 정보</value>
</data>
<data name="MusicGalleryPageFileInfoBitDepth.Header" xml:space="preserve"> <data name="MusicGalleryPageFileInfoBitDepth.Header" xml:space="preserve">
<value>비트 깊이</value> <value>비트 깊이</value>
</data> </data>
@@ -456,14 +462,14 @@
<data name="MusicGalleryPageFileNotFound.Text" xml:space="preserve"> <data name="MusicGalleryPageFileNotFound.Text" xml:space="preserve">
<value>미디어 라이브러리에서 곡을 찾지 못했습니다</value> <value>미디어 라이브러리에서 곡을 찾지 못했습니다</value>
</data> </data>
<data name="MusicGalleryPageFolder.Text" xml:space="preserve">
<value>폴더</value>
</data>
<data name="MusicGalleryPageImportFromFile.Text" xml:space="preserve"> <data name="MusicGalleryPageImportFromFile.Text" xml:space="preserve">
<value>파일에서 가져오기</value> <value>파일에서 가져오기</value>
</data> </data>
<data name="MusicGalleryPageNewPlaylist.Text" xml:space="preserve"> <data name="MusicGalleryPageNewPlaylist.Text" xml:space="preserve">
<value>재생 목록 생성</value> <value>재생 목록 만들기</value>
</data>
<data name="MusicGalleryPagePlayAll.Content" xml:space="preserve">
<value>모두 재생</value>
</data> </data>
<data name="MusicGalleryPagePlayingQueue.Text" xml:space="preserve"> <data name="MusicGalleryPagePlayingQueue.Text" xml:space="preserve">
<value>재생 대기열</value> <value>재생 대기열</value>
@@ -489,9 +495,6 @@
<data name="MusicGalleryPageScrollToPlayingItem.Text" xml:space="preserve"> <data name="MusicGalleryPageScrollToPlayingItem.Text" xml:space="preserve">
<value>재생 중인 항목으로 스크롤</value> <value>재생 중인 항목으로 스크롤</value>
</data> </data>
<data name="MusicGalleryPageSelectAll.Content" xml:space="preserve">
<value>모두 선택</value>
</data>
<data name="MusicGalleryPageSingleLoop.Text" xml:space="preserve"> <data name="MusicGalleryPageSingleLoop.Text" xml:space="preserve">
<value>한 곡 반복</value> <value>한 곡 반복</value>
</data> </data>
@@ -513,20 +516,29 @@
<data name="MusicGalleryPageSortType.Text" xml:space="preserve"> <data name="MusicGalleryPageSortType.Text" xml:space="preserve">
<value>정렬 방식</value> <value>정렬 방식</value>
</data> </data>
<data name="MusicGalleryPageStarredPlaylist.Content" xml:space="preserve">
<value>즐겨찾는 재생 목록</value>
</data>
<data name="MusicGalleryPageStopTrack.Text" xml:space="preserve"> <data name="MusicGalleryPageStopTrack.Text" xml:space="preserve">
<value>정지</value> <value>정지</value>
</data> </data>
<data name="MusicGalleryPageTitle" xml:space="preserve"> <data name="MusicGalleryPageTitle" xml:space="preserve">
<value>음악 갤러리 - BetterLyrics</value> <value>음악 갤러리 - BetterLyrics</value>
</data> </data>
<data name="MusicGalleryWindowDownButtonToolTip.Content" xml:space="preserve"> <data name="MusicSettingsControlAutoSyncInterval.Header" xml:space="preserve">
<value>접기</value> <value>자동 동기화 빈도</value>
</data> </data>
<data name="MusicGalleryWindowUpButtonToolTip.Content" xml:space="preserve"> <data name="MusicSettingsControlAutoSyncIntervalDisabled.Content" xml:space="preserve">
<value>펼치기</value> <value>절대로</value>
</data>
<data name="MusicSettingsControlAutoSyncIntervalEveryDay.Content" xml:space="preserve">
<value>매일</value>
</data>
<data name="MusicSettingsControlAutoSyncIntervalEveryFifteenMin.Content" xml:space="preserve">
<value>15분마다</value>
</data>
<data name="MusicSettingsControlAutoSyncIntervalEveryHour.Content" xml:space="preserve">
<value>매시간</value>
</data>
<data name="MusicSettingsControlAutoSyncIntervalEverySixHrs.Content" xml:space="preserve">
<value>6시간마다</value>
</data> </data>
<data name="NarrowMode" xml:space="preserve"> <data name="NarrowMode" xml:space="preserve">
<value>좁은 화면 모드</value> <value>좁은 화면 모드</value>
@@ -543,12 +555,27 @@
<data name="PrivacyPolicy.Content" xml:space="preserve"> <data name="PrivacyPolicy.Content" xml:space="preserve">
<value>개인정보 처리방침</value> <value>개인정보 처리방침</value>
</data> </data>
<data name="RemoteServerConfigControlBrowse.Content" xml:space="preserve">
<value>찾아보기</value>
</data>
<data name="RemoteServerConfigControlName.Header" xml:space="preserve">
<value>이름</value>
</data>
<data name="RemoteServerConfigControlName.PlaceholderText" xml:space="preserve">
<value>비워두면 기본 이름이 자동으로 생성됩니다.</value>
</data>
<data name="RemoteServerConfigControlPassword.Header" xml:space="preserve"> <data name="RemoteServerConfigControlPassword.Header" xml:space="preserve">
<value>비밀번호</value> <value>비밀번호</value>
</data> </data>
<data name="RemoteServerConfigControlPath.Header" xml:space="preserve"> <data name="RemoteServerConfigControlPath.Header" xml:space="preserve">
<value>경로</value> <value>경로</value>
</data> </data>
<data name="RemoteServerConfigControlPathNotExisted" xml:space="preserve">
<value>지정한 폴더 경로를 찾을 수 없습니다.</value>
</data>
<data name="RemoteServerConfigControlPathRequired" xml:space="preserve">
<value>경로 필수</value>
</data>
<data name="RemoteServerConfigControlPort.Header" xml:space="preserve"> <data name="RemoteServerConfigControlPort.Header" xml:space="preserve">
<value>포트</value> <value>포트</value>
</data> </data>
@@ -576,9 +603,6 @@
<data name="SetingsPageFeedback.Text" xml:space="preserve"> <data name="SetingsPageFeedback.Text" xml:space="preserve">
<value>피드백</value> <value>피드백</value>
</data> </data>
<data name="SetingsPageInstructions.Text" xml:space="preserve">
<value>사용 설명서</value>
</data>
<data name="SetingsPageSpecialThanks.Text" xml:space="preserve"> <data name="SetingsPageSpecialThanks.Text" xml:space="preserve">
<value>특별히 감사드리는 분들</value> <value>특별히 감사드리는 분들</value>
</data> </data>
@@ -606,9 +630,6 @@
<data name="SettingsPageAddFolderButton.Content" xml:space="preserve"> <data name="SettingsPageAddFolderButton.Content" xml:space="preserve">
<value>추가</value> <value>추가</value>
</data> </data>
<data name="SettingsPageAdvanced.Text" xml:space="preserve">
<value>고급 옵션</value>
</data>
<data name="SettingsPageAlbum.Header" xml:space="preserve"> <data name="SettingsPageAlbum.Header" xml:space="preserve">
<value>앨범</value> <value>앨범</value>
</data> </data>
@@ -624,15 +645,9 @@
<data name="SettingsPageAlbumArtSearchProvidersConfig.Text" xml:space="preserve"> <data name="SettingsPageAlbumArtSearchProvidersConfig.Text" xml:space="preserve">
<value>앨범 아트 소스 구성</value> <value>앨범 아트 소스 구성</value>
</data> </data>
<data name="SettingsPageAlbumArtSize.Header" xml:space="preserve">
<value>앨범 아트 크기</value>
</data>
<data name="SettingsPageAlbumEffect.Text" xml:space="preserve"> <data name="SettingsPageAlbumEffect.Text" xml:space="preserve">
<value>앨범 아트 효과</value> <value>앨범 아트 효과</value>
</data> </data>
<data name="SettingsPageAlbumLib.Content" xml:space="preserve">
<value>앨범 아트 소스</value>
</data>
<data name="SettingsPageAlbumRadius.Header" xml:space="preserve"> <data name="SettingsPageAlbumRadius.Header" xml:space="preserve">
<value>모서리 반경</value> <value>모서리 반경</value>
</data> </data>
@@ -663,12 +678,6 @@
<data name="SettingsPageAppAppearance.Text" xml:space="preserve"> <data name="SettingsPageAppAppearance.Text" xml:space="preserve">
<value>앱 모양</value> <value>앱 모양</value>
</data> </data>
<data name="SettingsPageAppBehavior.Text" xml:space="preserve">
<value>일반 동작</value>
</data>
<data name="SettingsPageApply.Content" xml:space="preserve">
<value>적용</value>
</data>
<data name="SettingsPageArtist.Header" xml:space="preserve"> <data name="SettingsPageArtist.Header" xml:space="preserve">
<value>아티스트</value> <value>아티스트</value>
</data> </data>
@@ -687,21 +696,12 @@
<data name="SettingsPageAutoStart.Header" xml:space="preserve"> <data name="SettingsPageAutoStart.Header" xml:space="preserve">
<value>자동 시작</value> <value>자동 시작</value>
</data> </data>
<data name="SettingsPageAutoStartWindow.Header" xml:space="preserve">
<value>애플리케이션 시작 시</value>
</data>
<data name="SettingsPageBackdrop.Header" xml:space="preserve">
<value>가사 배경 재질</value>
</data>
<data name="SettingsPageBackgroundOverlay.Text" xml:space="preserve"> <data name="SettingsPageBackgroundOverlay.Text" xml:space="preserve">
<value>가사 배경</value> <value>가사 배경</value>
</data> </data>
<data name="SettingsPageBlurAmount.Header" xml:space="preserve"> <data name="SettingsPageBlurAmount.Header" xml:space="preserve">
<value>흐림 효과 강도</value> <value>흐림 효과 강도</value>
</data> </data>
<data name="SettingsPageBorderless.Header" xml:space="preserve">
<value>테두리 없는 창</value>
</data>
<data name="SettingsPageCache.Description" xml:space="preserve"> <data name="SettingsPageCache.Description" xml:space="preserve">
<value>로그 파일, 온라인 가사 캐시 포함</value> <value>로그 파일, 온라인 가사 캐시 포함</value>
</data> </data>
@@ -738,9 +738,6 @@
<data name="SettingsPageCollapseDropdown.Content" xml:space="preserve"> <data name="SettingsPageCollapseDropdown.Content" xml:space="preserve">
<value>드롭다운 접기</value> <value>드롭다운 접기</value>
</data> </data>
<data name="SettingsPageCompactTitleBar.Content" xml:space="preserve">
<value>콤팩트</value>
</data>
<data name="SettingsPageConfigName.Description" xml:space="preserve"> <data name="SettingsPageConfigName.Description" xml:space="preserve">
<value>기록된 창 상태에 이름을 지정하면 더 잘 구별할 수 있습니다</value> <value>기록된 창 상태에 이름을 지정하면 더 잘 구별할 수 있습니다</value>
</data> </data>
@@ -759,18 +756,12 @@
<data name="SettingsPageCrossfade.Content" xml:space="preserve"> <data name="SettingsPageCrossfade.Content" xml:space="preserve">
<value>크로스페이드</value> <value>크로스페이드</value>
</data> </data>
<data name="SettingsPageCurrentLyricsWindowStatus.Text" xml:space="preserve">
<value>현재 가사 창 상태</value>
</data>
<data name="SettingsPageCutletDockerServer.Header" xml:space="preserve"> <data name="SettingsPageCutletDockerServer.Header" xml:space="preserve">
<value>cutlet-docker 음역 서비스</value> <value>cutlet-docker 음역 서비스</value>
</data> </data>
<data name="SettingsPageDark.Content" xml:space="preserve"> <data name="SettingsPageDark.Content" xml:space="preserve">
<value>다크</value> <value>다크</value>
</data> </data>
<data name="SettingsPageDebugOverlay.Header" xml:space="preserve">
<value>디버그 오버레이 표시</value>
</data>
<data name="SettingsPageDelete.Text" xml:space="preserve"> <data name="SettingsPageDelete.Text" xml:space="preserve">
<value>삭제</value> <value>삭제</value>
</data> </data>
@@ -801,15 +792,9 @@
<data name="SettingsPageDockPlacementTop.Content" xml:space="preserve"> <data name="SettingsPageDockPlacementTop.Content" xml:space="preserve">
<value>상단</value> <value>상단</value>
</data> </data>
<data name="SettingsPageDockWindowHeight.Header" xml:space="preserve">
<value>창 높이</value>
</data>
<data name="SettingsPageDragArea.Header" xml:space="preserve"> <data name="SettingsPageDragArea.Header" xml:space="preserve">
<value>드래그 가능 영역</value> <value>드래그 가능 영역</value>
</data> </data>
<data name="SettingsPageEasingFuncType.Header" xml:space="preserve">
<value>이징 함수 유형</value>
</data>
<data name="SettingsPageEasingTypeEaseInOutBack.Content" xml:space="preserve"> <data name="SettingsPageEasingTypeEaseInOutBack.Content" xml:space="preserve">
<value>Back Ease In-Out</value> <value>Back Ease In-Out</value>
</data> </data>
@@ -873,18 +858,15 @@
<data name="SettingsPageExitOnLyricsWindowClosed.Header" xml:space="preserve"> <data name="SettingsPageExitOnLyricsWindowClosed.Header" xml:space="preserve">
<value>가사 창을 닫을 때 앱 종료</value> <value>가사 창을 닫을 때 앱 종료</value>
</data> </data>
<data name="SettingsPageExportPlayHistoryButton.Content" xml:space="preserve">
<value>플레이 기록 내보내기</value>
</data>
<data name="SettingsPageExportSettingsButton.Content" xml:space="preserve"> <data name="SettingsPageExportSettingsButton.Content" xml:space="preserve">
<value>설정 내보내기</value> <value>설정 내보내기</value>
</data> </data>
<data name="SettingsPageExtendedTitleBar.Content" xml:space="preserve">
<value>확장</value>
</data>
<data name="SettingsPageFan.Header" xml:space="preserve"> <data name="SettingsPageFan.Header" xml:space="preserve">
<value>부채꼴 가사</value> <value>부채꼴 가사</value>
</data> </data>
<data name="SettingsPageFAQ.Content" xml:space="preserve">
<value>자주 묻는 질문 (FAQ)</value>
</data>
<data name="SettingsPageFixedTimeStep.Header" xml:space="preserve"> <data name="SettingsPageFixedTimeStep.Header" xml:space="preserve">
<value>고정 타임스텝 렌더링</value> <value>고정 타임스텝 렌더링</value>
</data> </data>
@@ -921,9 +903,6 @@
<data name="SettingsPageHeight.Header" xml:space="preserve"> <data name="SettingsPageHeight.Header" xml:space="preserve">
<value>높이</value> <value>높이</value>
</data> </data>
<data name="SettingsPageHello.Text" xml:space="preserve">
<value>안녕하세요</value>
</data>
<data name="SettingsPageHelpUsTranslate.Content" xml:space="preserve"> <data name="SettingsPageHelpUsTranslate.Content" xml:space="preserve">
<value>이 애플리케이션 번역 돕기</value> <value>이 애플리케이션 번역 돕기</value>
</data> </data>
@@ -954,9 +933,6 @@
<data name="SettingsPageJapanese.Header" xml:space="preserve"> <data name="SettingsPageJapanese.Header" xml:space="preserve">
<value>일본어 발음 표기</value> <value>일본어 발음 표기</value>
</data> </data>
<data name="SettingsPageJoinNowButton.Content" xml:space="preserve">
<value>지금 가입하기</value>
</data>
<data name="SettingsPageJyutping.Content" xml:space="preserve"> <data name="SettingsPageJyutping.Content" xml:space="preserve">
<value>Jyutping (광동어)</value> <value>Jyutping (광동어)</value>
</data> </data>
@@ -1005,18 +981,12 @@
<data name="SettingsPageLight.Content" xml:space="preserve"> <data name="SettingsPageLight.Content" xml:space="preserve">
<value>라이트</value> <value>라이트</value>
</data> </data>
<data name="SettingsPageLinkedFile.Text" xml:space="preserve">
<value>연결된 로컬 파일</value>
</data>
<data name="SettingsPageListenNewSession.Header" xml:space="preserve"> <data name="SettingsPageListenNewSession.Header" xml:space="preserve">
<value>새 재생 소스 감지 활성화</value> <value>새 재생 소스 감지 활성화</value>
</data> </data>
<data name="SettingsPageLocalFolder.Text" xml:space="preserve"> <data name="SettingsPageLocalFolder.Text" xml:space="preserve">
<value>로컬 폴더</value> <value>로컬 폴더</value>
</data> </data>
<data name="SettingsPageLog.Header" xml:space="preserve">
<value>로그 기록</value>
</data>
<data name="SettingsPageLongSyllableDuration.Header" xml:space="preserve"> <data name="SettingsPageLongSyllableDuration.Header" xml:space="preserve">
<value>장음절 임계값</value> <value>장음절 임계값</value>
</data> </data>
@@ -1071,15 +1041,6 @@
<data name="SettingsPageLyricsFgFontColor.Header" xml:space="preserve"> <data name="SettingsPageLyricsFgFontColor.Header" xml:space="preserve">
<value>현재 행</value> <value>현재 행</value>
</data> </data>
<data name="SettingsPageLyricsFgFontColorAdaptiveColored.Content" xml:space="preserve">
<value>가사 배경에 적응 (컬러)</value>
</data>
<data name="SettingsPageLyricsFgFontColorAdaptiveGrayed.Content" xml:space="preserve">
<value>가사 배경에 적응 (회색조)</value>
</data>
<data name="SettingsPageLyricsFgFontColorCustom.Content" xml:space="preserve">
<value>사용자 지정</value>
</data>
<data name="SettingsPageLyricsFloatAnimation.Header" xml:space="preserve"> <data name="SettingsPageLyricsFloatAnimation.Header" xml:space="preserve">
<value>플로팅 애니메이션</value> <value>플로팅 애니메이션</value>
</data> </data>
@@ -1107,27 +1068,12 @@
<data name="SettingsPageLyricsGlowEffect.Header" xml:space="preserve"> <data name="SettingsPageLyricsGlowEffect.Header" xml:space="preserve">
<value>발광 효과</value> <value>발광 효과</value>
</data> </data>
<data name="SettingsPageLyricsHighlight.Header" xml:space="preserve">
<value>하이라이트</value>
</data>
<data name="SettingsPageLyricsHighlightScope.Header" xml:space="preserve">
<value>원문 하이라이트 범위</value>
</data>
<data name="SettingsPageLyricsLeft.Content" xml:space="preserve">
<value>왼쪽</value>
</data>
<data name="SettingsPageLyricsLight.Content" xml:space="preserve"> <data name="SettingsPageLyricsLight.Content" xml:space="preserve">
<value>라이트</value> <value>라이트</value>
</data> </data>
<data name="SettingsPageLyricsLineFade.Header" xml:space="preserve">
<value>재생 영역 가장자리 페이드</value>
</data>
<data name="SettingsPageLyricsLineSpacingFactor.Header" xml:space="preserve"> <data name="SettingsPageLyricsLineSpacingFactor.Header" xml:space="preserve">
<value>줄 간격</value> <value>줄 간격</value>
</data> </data>
<data name="SettingsPageLyricsLineSpacingFactorUnit.Text" xml:space="preserve">
<value> 배 (줄 높이 기준)</value>
</data>
<data name="SettingsPageLyricsMedium.Content" xml:space="preserve"> <data name="SettingsPageLyricsMedium.Content" xml:space="preserve">
<value>미디엄</value> <value>미디엄</value>
</data> </data>
@@ -1170,9 +1116,6 @@
<data name="SettingsPageLyricsSemiLight.Content" xml:space="preserve"> <data name="SettingsPageLyricsSemiLight.Content" xml:space="preserve">
<value>세미 라이트</value> <value>세미 라이트</value>
</data> </data>
<data name="SettingsPageLyricsShadow.Header" xml:space="preserve">
<value>그림자</value>
</data>
<data name="SettingsPageLyricsStyle.Text" xml:space="preserve"> <data name="SettingsPageLyricsStyle.Text" xml:space="preserve">
<value>가사 스타일</value> <value>가사 스타일</value>
</data> </data>
@@ -1188,30 +1131,15 @@
<data name="SettingsPageLyricsTimelineThreshold.Header" xml:space="preserve"> <data name="SettingsPageLyricsTimelineThreshold.Header" xml:space="preserve">
<value>가사 타임라인 동기화 임계값</value> <value>가사 타임라인 동기화 임계값</value>
</data> </data>
<data name="SettingsPageLyricsTranslationHighlight.Header" xml:space="preserve">
<value>번역 하이라이트</value>
</data>
<data name="SettingsPageLyricsTranslationSeparator.Header" xml:space="preserve">
<value>원문-번역 구분 기호</value>
</data>
<data name="SettingsPageLyricsVerticalEdgeOpacity.Header" xml:space="preserve">
<value>수직 가장자리 불투명도</value>
</data>
<data name="SettingsPageLyricsWindow.Text" xml:space="preserve"> <data name="SettingsPageLyricsWindow.Text" xml:space="preserve">
<value>가사 창</value> <value>가사 창</value>
</data> </data>
<data name="SettingsPageLyricsWindowManager.Text" xml:space="preserve">
<value>가사 창 관리자</value>
</data>
<data name="SettingsPageLyricsWindowMgr.Content" xml:space="preserve"> <data name="SettingsPageLyricsWindowMgr.Content" xml:space="preserve">
<value>가사 창 관리자</value> <value>가사 창 관리자</value>
</data> </data>
<data name="SettingsPageLyricsWindowSwitchHotKey.Header" xml:space="preserve"> <data name="SettingsPageLyricsWindowSwitchHotKey.Header" xml:space="preserve">
<value>가사 창 상태 전환 단축키</value> <value>가사 창 상태 전환 단축키</value>
</data> </data>
<data name="SettingsPageLyricsWindowToolTip.Content" xml:space="preserve">
<value>가사 창</value>
</data>
<data name="SettingsPageMatchingThreshold.Description" xml:space="preserve"> <data name="SettingsPageMatchingThreshold.Description" xml:space="preserve">
<value>이 값을 조정하면 순차 검색 및 최적 일치 검색 결과에 영향을 미치지만 수동 가사 검색 인터페이스의 검색 결과에는 영향을 미치지 않습니다</value> <value>이 값을 조정하면 순차 검색 및 최적 일치 검색 결과에 영향을 미치지만 수동 가사 검색 인터페이스의 검색 결과에는 영향을 미치지 않습니다</value>
</data> </data>
@@ -1248,18 +1176,12 @@
<data name="SettingsPageMusicLib.Header" xml:space="preserve"> <data name="SettingsPageMusicLib.Header" xml:space="preserve">
<value>로컬 미디어 라이브러리</value> <value>로컬 미디어 라이브러리</value>
</data> </data>
<data name="SettingsPageMusicLibRealTimeWatch.Header" xml:space="preserve">
<value>실시간 파일 감시</value>
</data>
<data name="SettingsPageNarrowMode.Text" xml:space="preserve"> <data name="SettingsPageNarrowMode.Text" xml:space="preserve">
<value>좁은 화면 모드</value> <value>좁은 화면 모드</value>
</data> </data>
<data name="SettingsPageNextSongHotKey.Header" xml:space="preserve"> <data name="SettingsPageNextSongHotKey.Header" xml:space="preserve">
<value>다음 곡 단축키</value> <value>다음 곡 단축키</value>
</data> </data>
<data name="SettingsPageNoBackdrop.Content" xml:space="preserve">
<value>없음</value>
</data>
<data name="SettingsPageOctTree.Content" xml:space="preserve"> <data name="SettingsPageOctTree.Content" xml:space="preserve">
<value>공격적</value> <value>공격적</value>
</data> </data>
@@ -1287,9 +1209,6 @@
<data name="SettingsPagePathIncludingOthersInfo" xml:space="preserve"> <data name="SettingsPagePathIncludingOthersInfo" xml:space="preserve">
<value>이 폴더에는 이미 추가된 폴더가 포함되어 있습니다. 이 폴더를 추가하려면 해당 폴더를 삭제하세요</value> <value>이 폴더에는 이미 추가된 폴더가 포함되어 있습니다. 이 폴더를 추가하려면 해당 폴더를 삭제하세요</value>
</data> </data>
<data name="SettingsPagePathNotFound.Text" xml:space="preserve">
<value>컴퓨터에서 해당 경로를 찾을 수 없습니다</value>
</data>
<data name="SettingsPagePatrons.Text" xml:space="preserve"> <data name="SettingsPagePatrons.Text" xml:space="preserve">
<value>후원</value> <value>후원</value>
</data> </data>
@@ -1335,15 +1254,9 @@
<data name="SettingsPageRealtimeStatus.Text" xml:space="preserve"> <data name="SettingsPageRealtimeStatus.Text" xml:space="preserve">
<value>실시간 상태</value> <value>실시간 상태</value>
</data> </data>
<data name="SettingsPageRecord.Content" xml:space="preserve">
<value>기록</value>
</data>
<data name="SettingsPageRecordedWindowStatus.Text" xml:space="preserve"> <data name="SettingsPageRecordedWindowStatus.Text" xml:space="preserve">
<value>기록된 창 상태</value> <value>기록된 창 상태</value>
</data> </data>
<data name="SettingsPageReference.Header" xml:space="preserve">
<value>참조 링크</value>
</data>
<data name="SettingsPageRefreshDropdown.Content" xml:space="preserve"> <data name="SettingsPageRefreshDropdown.Content" xml:space="preserve">
<value>드롭다운 새로 고침</value> <value>드롭다운 새로 고침</value>
</data> </data>
@@ -1362,9 +1275,6 @@
<data name="SettingsPageRight.Content" xml:space="preserve"> <data name="SettingsPageRight.Content" xml:space="preserve">
<value>오른쪽</value> <value>오른쪽</value>
</data> </data>
<data name="SettingsPageRomaji.Header" xml:space="preserve">
<value>일본어 발음 표기</value>
</data>
<data name="SettingsPageScope.Header" xml:space="preserve"> <data name="SettingsPageScope.Header" xml:space="preserve">
<value>범위</value> <value>범위</value>
</data> </data>
@@ -1404,6 +1314,9 @@
<data name="SettingsPageSettingsManager.Header" xml:space="preserve"> <data name="SettingsPageSettingsManager.Header" xml:space="preserve">
<value>설정 관리자</value> <value>설정 관리자</value>
</data> </data>
<data name="SettingsPageSettingsPlayHistory.Header" xml:space="preserve">
<value>플레이 기록</value>
</data>
<data name="SettingsPageShareHub.Content" xml:space="preserve"> <data name="SettingsPageShareHub.Content" xml:space="preserve">
<value>온라인 공유 허브 탐색</value> <value>온라인 공유 허브 탐색</value>
</data> </data>
@@ -1431,18 +1344,12 @@
<data name="SettingsPageShowInSwitchers.Header" xml:space="preserve"> <data name="SettingsPageShowInSwitchers.Header" xml:space="preserve">
<value>시스템 환경에 표시</value> <value>시스템 환경에 표시</value>
</data> </data>
<data name="SettingsPageShowLayoutDragger.Header" xml:space="preserve">
<value>레이아웃 분할기 표시</value>
</data>
<data name="SettingsPageShowTitle.Header" xml:space="preserve"> <data name="SettingsPageShowTitle.Header" xml:space="preserve">
<value>제목 표시</value> <value>제목 표시</value>
</data> </data>
<data name="SettingsPageSlide.Content" xml:space="preserve"> <data name="SettingsPageSlide.Content" xml:space="preserve">
<value>슬라이드</value> <value>슬라이드</value>
</data> </data>
<data name="SettingsPageSliderPrefix.Text" xml:space="preserve">
<value>현재 값: </value>
</data>
<data name="SettingsPageSnowFlakeLayer.Header" xml:space="preserve"> <data name="SettingsPageSnowFlakeLayer.Header" xml:space="preserve">
<value>눈송이 레이어</value> <value>눈송이 레이어</value>
</data> </data>
@@ -1485,6 +1392,9 @@
<data name="SettingsPageStartup.Text" xml:space="preserve"> <data name="SettingsPageStartup.Text" xml:space="preserve">
<value>시작</value> <value>시작</value>
</data> </data>
<data name="SettingsPageStats.Content" xml:space="preserve">
<value>통계</value>
</data>
<data name="SettingsPageStopTrackOnGalleryWindowClosed.Header" xml:space="preserve"> <data name="SettingsPageStopTrackOnGalleryWindowClosed.Header" xml:space="preserve">
<value>음악 갤러리 창을 닫을 때 재생 중지</value> <value>음악 갤러리 창을 닫을 때 재생 중지</value>
</data> </data>
@@ -1503,9 +1413,6 @@
<data name="SettingsPageTaskbarPlacement.Header" xml:space="preserve"> <data name="SettingsPageTaskbarPlacement.Header" xml:space="preserve">
<value>작업 표시줄 고정 위치</value> <value>작업 표시줄 고정 위치</value>
</data> </data>
<data name="SettingsPageThanksForPurchasing.Text" xml:space="preserve">
<value>BetterLyrics를 구매해 주셔서 감사합니다</value>
</data>
<data name="SettingsPageThanksList.Header" xml:space="preserve"> <data name="SettingsPageThanksList.Header" xml:space="preserve">
<value>크레딧</value> <value>크레딧</value>
</data> </data>
@@ -1524,12 +1431,6 @@
<data name="SettingsPageTitleBarAreaWhole.Content" xml:space="preserve"> <data name="SettingsPageTitleBarAreaWhole.Content" xml:space="preserve">
<value>전체 창</value> <value>전체 창</value>
</data> </data>
<data name="SettingsPageTitleBarType.Header" xml:space="preserve">
<value>제목 표시줄 크기</value>
</data>
<data name="SettingsPageToggleHotKey.Header" xml:space="preserve">
<value>활성화/비활성화 전환 단축키</value>
</data>
<data name="SettingsPageTranslatedText.Header" xml:space="preserve"> <data name="SettingsPageTranslatedText.Header" xml:space="preserve">
<value>번역문</value> <value>번역문</value>
</data> </data>
@@ -1539,9 +1440,6 @@
<data name="SettingsPageTranslationConfig.Header" xml:space="preserve"> <data name="SettingsPageTranslationConfig.Header" xml:space="preserve">
<value>LibreTranslate 번역 서비스</value> <value>LibreTranslate 번역 서비스</value>
</data> </data>
<data name="SettingsPageTranslationInfoLink.Text" xml:space="preserve">
<value>설치 튜토리얼 및 자세한 정보는 https://github.com/LibreTranslate/LibreTranslate를 방문하세요 (이 소프트웨어는 해당 번역 서비스와 관련이 없습니다)</value>
</data>
<data name="SettingsPageUserWhoPurchased.Text" xml:space="preserve"> <data name="SettingsPageUserWhoPurchased.Text" xml:space="preserve">
<value>및 BetterLyrics를 구매해 주신 사용자 여러분</value> <value>및 BetterLyrics를 구매해 주신 사용자 여러분</value>
</data> </data>
@@ -1554,9 +1452,6 @@
<data name="SettingsPageWidth.Header" xml:space="preserve"> <data name="SettingsPageWidth.Header" xml:space="preserve">
<value>너비</value> <value>너비</value>
</data> </data>
<data name="SettingsPageWindowBounds.Header" xml:space="preserve">
<value>창 경계</value>
</data>
<data name="SettingsPageWorkArea.Description" xml:space="preserve"> <data name="SettingsPageWorkArea.Description" xml:space="preserve">
<value>별도의 작업 영역으로 화면 상단/하단 가장자리에 도킹</value> <value>별도의 작업 영역으로 화면 상단/하단 가장자리에 도킹</value>
</data> </data>
@@ -1572,6 +1467,39 @@
<data name="StandardMode" xml:space="preserve"> <data name="StandardMode" xml:space="preserve">
<value>표준 모드</value> <value>표준 모드</value>
</data> </data>
<data name="StatsDashboardControlSources.Text" xml:space="preserve">
<value>출처</value>
</data>
<data name="StatsDashboardControlThisMonth.Header" xml:space="preserve">
<value>이번 달</value>
</data>
<data name="StatsDashboardControlThisQuarter.Header" xml:space="preserve">
<value>이번 분기</value>
</data>
<data name="StatsDashboardControlThisWeek.Header" xml:space="preserve">
<value>이번 주</value>
</data>
<data name="StatsDashboardControlThisYear.Header" xml:space="preserve">
<value>올해</value>
</data>
<data name="StatsDashboardControlToday.Header" xml:space="preserve">
<value>오늘</value>
</data>
<data name="StatsDashboardControlTopArtists.Text" xml:space="preserve">
<value>톱 아티스트</value>
</data>
<data name="StatsDashboardControlTopSongs.Text" xml:space="preserve">
<value>인기 트랙</value>
</data>
<data name="StatsDashboardControlTopSource.Text" xml:space="preserve">
<value>상위 소스</value>
</data>
<data name="StatsDashboardControlTotalDuration.Text" xml:space="preserve">
<value>총 기간</value>
</data>
<data name="StatsDashboardControlTracksPlayed.Text" xml:space="preserve">
<value>재생된 트랙</value>
</data>
<data name="SystemTrayExit.Text" xml:space="preserve"> <data name="SystemTrayExit.Text" xml:space="preserve">
<value>종료</value> <value>종료</value>
</data> </data>
@@ -1581,9 +1509,6 @@
<data name="SystemTrayMusicGallery.Text" xml:space="preserve"> <data name="SystemTrayMusicGallery.Text" xml:space="preserve">
<value>음악 갤러리 열기</value> <value>음악 갤러리 열기</value>
</data> </data>
<data name="SystemTrayPageTitle" xml:space="preserve">
<value>시스템 트레이 - BetterLyrics</value>
</data>
<data name="SystemTrayResetWindowPosition.Text" xml:space="preserve"> <data name="SystemTrayResetWindowPosition.Text" xml:space="preserve">
<value>창 위치 초기화</value> <value>창 위치 초기화</value>
</data> </data>

View File

@@ -129,21 +129,12 @@
<data name="AlbumArtSearchSMTCProvider" xml:space="preserve"> <data name="AlbumArtSearchSMTCProvider" xml:space="preserve">
<value>Pemain muzik</value> <value>Pemain muzik</value>
</data> </data>
<data name="AllLyricsSettingsControlPictureInPicture.Content" xml:space="preserve">
<value>Mod Gambar-dalam-Gambar (PiP)</value>
</data>
<data name="AppSettingsControlGeneral.Text" xml:space="preserve"> <data name="AppSettingsControlGeneral.Text" xml:space="preserve">
<value>Tetingkap</value> <value>Tetingkap</value>
</data> </data>
<data name="ArtistsSplitHint.Text" xml:space="preserve"> <data name="ArtistsSplitHint.Text" xml:space="preserve">
<value>Apabila memasukkan berbilang artis, sila gunakan salah satu pemisah berikut untuk memisahkannya (jangan campur aduk)</value> <value>Apabila memasukkan berbilang artis, sila gunakan salah satu pemisah berikut untuk memisahkannya (jangan campur aduk)</value>
</data> </data>
<data name="BaseWindowHostInfoBarCheckBox.Content" xml:space="preserve">
<value>Jangan tunjukkan mesej ini lagi</value>
</data>
<data name="BaseWindowMiniFlyoutItem.Text" xml:space="preserve">
<value>Mod Gambar-dalam-Gambar (PiP)</value>
</data>
<data name="Cancel" xml:space="preserve"> <data name="Cancel" xml:space="preserve">
<value>Batal</value> <value>Batal</value>
</data> </data>
@@ -168,24 +159,45 @@
<data name="DockedMode" xml:space="preserve"> <data name="DockedMode" xml:space="preserve">
<value>Mod Dok</value> <value>Mod Dok</value>
</data> </data>
<data name="Error" xml:space="preserve">
<value>Ralat</value>
</data>
<data name="ExportSettingsSuccess" xml:space="preserve"> <data name="ExportSettingsSuccess" xml:space="preserve">
<value>Eksport berjaya</value> <value>Eksport berjaya</value>
</data> </data>
<data name="FailToStartLXMusicServer" xml:space="preserve"> <data name="FailToStartLXMusicServer" xml:space="preserve">
<value>Tidak dapat menyambung ke pelayan LX Music, sila pergi ke Tetapan - Sumber Main Balik - LX Music - Pelayan LX Music untuk menyemak sama ada pautan dimasukkan dengan betul</value> <value>Tidak dapat menyambung ke pelayan LX Music, sila pergi ke Tetapan - Sumber Main Balik - LX Music - Pelayan LX Music untuk menyemak sama ada pautan dimasukkan dengan betul</value>
</data> </data>
<data name="FileSystemServiceCleaningCache" xml:space="preserve">
<value>Membersihkan cache...</value>
</data>
<data name="FileSystemServiceConnectFailed" xml:space="preserve">
<value>Sambungan gagal</value>
</data>
<data name="FileSystemServiceConnecting" xml:space="preserve">
<value>Menyambung...</value>
</data>
<data name="FileSystemServiceFetchingFileList" xml:space="preserve">
<value>Mengambil senarai fail...</value>
</data>
<data name="FileSystemServiceParsing" xml:space="preserve">
<value>Menghurai...</value>
</data>
<data name="FileSystemServicePrepareToClean" xml:space="preserve">
<value>Bersedia untuk membersihkan cache...</value>
</data>
<data name="FileSystemServiceReady" xml:space="preserve">
<value>Sedia</value>
</data>
<data name="FileSystemServiceRootDirectoryWarning" xml:space="preserve">
<value>Laluan direktori akar telah dikesan. Indeks cakera penuh mungkin mengandungi sejumlah besar fail bukan media dan menyebabkan imbasan mengambil masa terlalu lama. Adalah disyorkan untuk menentukan subdirektori tertentu.</value>
</data>
<data name="FileSystemServiceWaitingForScan" xml:space="preserve">
<value>Bersedia untuk mengimbas...</value>
</data>
<data name="FullscreenMode" xml:space="preserve"> <data name="FullscreenMode" xml:space="preserve">
<value>Mod Skrin Penuh</value> <value>Mod Skrin Penuh</value>
</data> </data>
<data name="HostWindowClickThroughButton.Content" xml:space="preserve">
<value>Kunci</value>
</data>
<data name="HostWindowClickThroughFlyoutItem.Text" xml:space="preserve">
<value>Kunci</value>
</data>
<data name="HostWindowLockToolTip.Text" xml:space="preserve">
<value>Kunci</value>
</data>
<data name="HostWindowMusicGalleryButtonToolTip.Content" xml:space="preserve"> <data name="HostWindowMusicGalleryButtonToolTip.Content" xml:space="preserve">
<value>Galeri Muzik</value> <value>Galeri Muzik</value>
</data> </data>
@@ -204,9 +216,6 @@
<data name="Jyutping" xml:space="preserve"> <data name="Jyutping" xml:space="preserve">
<value>Jyutping (Kantonis)</value> <value>Jyutping (Kantonis)</value>
</data> </data>
<data name="KeepAtLeastOneStatusDefault" xml:space="preserve">
<value>Sila pastikan sekurang-kurangnya satu status ditetapkan sebagai lalai</value>
</data>
<data name="LastFMAuthFailed" xml:space="preserve"> <data name="LastFMAuthFailed" xml:space="preserve">
<value>Pemberian kuasa gagal, sila cuba lagi</value> <value>Pemberian kuasa gagal, sila cuba lagi</value>
</data> </data>
@@ -270,18 +279,12 @@
<data name="LyricsPageSettings.Text" xml:space="preserve"> <data name="LyricsPageSettings.Text" xml:space="preserve">
<value>Tetapan</value> <value>Tetapan</value>
</data> </data>
<data name="LyricsPageTimelineOffsetButtonToolTip.Content" xml:space="preserve">
<value>Ofset Garis Masa Lirik</value>
</data>
<data name="LyricsPageTranslationEnabled.Description" xml:space="preserve"> <data name="LyricsPageTranslationEnabled.Description" xml:space="preserve">
<value>Akan mengutamakan pembacaan terjemahan dalam lirik, jika tiada padanan maka akan meminta terjemahan mesin daripada pelayan LibreTranslate</value> <value>Akan mengutamakan pembacaan terjemahan dalam lirik, jika tiada padanan maka akan meminta terjemahan mesin daripada pelayan LibreTranslate</value>
</data> </data>
<data name="LyricsPageTranslationEnabled.Header" xml:space="preserve"> <data name="LyricsPageTranslationEnabled.Header" xml:space="preserve">
<value>Dayakan Terjemahan</value> <value>Dayakan Terjemahan</value>
</data> </data>
<data name="LyricsPageTranslationOnly.Header" xml:space="preserve">
<value>Hanya Tunjukkan Terjemahan</value>
</data>
<data name="LyricsPageTranslationProviderPrefix.Header" xml:space="preserve"> <data name="LyricsPageTranslationProviderPrefix.Header" xml:space="preserve">
<value>Penyedia Terjemahan</value> <value>Penyedia Terjemahan</value>
</data> </data>
@@ -330,9 +333,6 @@
<data name="LyricsSearchControlSongInfoMapping.Text" xml:space="preserve"> <data name="LyricsSearchControlSongInfoMapping.Text" xml:space="preserve">
<value>Pemetaan Info Lagu</value> <value>Pemetaan Info Lagu</value>
</data> </data>
<data name="LyricsSearchControlTargetSearchProvider.Header" xml:space="preserve">
<value>Penyedia Carian Lirik Sasaran</value>
</data>
<data name="LyricsSearchControlTitle.Header" xml:space="preserve"> <data name="LyricsSearchControlTitle.Header" xml:space="preserve">
<value>Tajuk</value> <value>Tajuk</value>
</data> </data>
@@ -351,15 +351,9 @@
<data name="LyricsSearchProviderTtmlFile" xml:space="preserve"> <data name="LyricsSearchProviderTtmlFile" xml:space="preserve">
<value>Fail .TTML Tempatan</value> <value>Fail .TTML Tempatan</value>
</data> </data>
<data name="LyricsWindowImmersiveButtonToolTip.Content" xml:space="preserve">
<value>Mod Imersif</value>
</data>
<data name="LyricsWindowSettingsControlLyricsWindowConfig.Text" xml:space="preserve"> <data name="LyricsWindowSettingsControlLyricsWindowConfig.Text" xml:space="preserve">
<value>Konfigurasi</value> <value>Konfigurasi</value>
</data> </data>
<data name="LyricsWindowSettingsControlLyricsWindowMode.Header" xml:space="preserve">
<value>Mod Tetingkap Lirik</value>
</data>
<data name="LyricsWindowSettingsControlSetDefault.Text" xml:space="preserve"> <data name="LyricsWindowSettingsControlSetDefault.Text" xml:space="preserve">
<value>Tetapkan sebagai Lalai</value> <value>Tetapkan sebagai Lalai</value>
</data> </data>
@@ -378,9 +372,6 @@
<data name="MainPageAlbumArtOnly.Content" xml:space="preserve"> <data name="MainPageAlbumArtOnly.Content" xml:space="preserve">
<value>Hanya tunjukkan kawasan kulit album</value> <value>Hanya tunjukkan kawasan kulit album</value>
</data> </data>
<data name="MainPageEnterImmersiveModeHint" xml:space="preserve">
<value>Lalukan tetikus lagi untuk menunjukkan butang togol</value>
</data>
<data name="MainPageLyriscOnly.Content" xml:space="preserve"> <data name="MainPageLyriscOnly.Content" xml:space="preserve">
<value>Hanya tunjukkan lirik</value> <value>Hanya tunjukkan lirik</value>
</data> </data>
@@ -396,6 +387,18 @@
<data name="MainPageSplitView.Content" xml:space="preserve"> <data name="MainPageSplitView.Content" xml:space="preserve">
<value>Paparan Pisah</value> <value>Paparan Pisah</value>
</data> </data>
<data name="MediaSettingsControlLastSyncTime.Header" xml:space="preserve">
<value>Masa Segerak Akhir</value>
</data>
<data name="MediaSettingsControlLocalFolder" xml:space="preserve">
<value>Folder setempat</value>
</data>
<data name="MediaSettingsControlNameSetting.Header" xml:space="preserve">
<value>Nama</value>
</data>
<data name="MediaSettingsControlSyncNow.Content" xml:space="preserve">
<value>Segerak sekarang</value>
</data>
<data name="MusicGalleryPageAddToCustomList.Text" xml:space="preserve"> <data name="MusicGalleryPageAddToCustomList.Text" xml:space="preserve">
<value>Tambah ke senarai main</value> <value>Tambah ke senarai main</value>
</data> </data>
@@ -406,11 +409,17 @@
<value>Item seterusnya</value> <value>Item seterusnya</value>
</data> </data>
<data name="MusicGalleryPageAddToPlayingQueue.Text" xml:space="preserve"> <data name="MusicGalleryPageAddToPlayingQueue.Text" xml:space="preserve">
<value>Tambah ke baris gilir main</value> <value>Tambah ke turutan lagu</value>
</data> </data>
<data name="MusicGalleryPageAllSongs" xml:space="preserve"> <data name="MusicGalleryPageAllSongs" xml:space="preserve">
<value>Semua Muzik</value> <value>Semua Muzik</value>
</data> </data>
<data name="MusicGalleryPageDataSync.Message" xml:space="preserve">
<value>Penyegerakan Pustaka Media sedang dijalankan...</value>
</data>
<data name="MusicGalleryPageDataSyncError.Message" xml:space="preserve">
<value>Terdapat masalah dengan penyegerakan Pustaka Media</value>
</data>
<data name="MusicGalleryPageEmptyPlayingQueue.Text" xml:space="preserve"> <data name="MusicGalleryPageEmptyPlayingQueue.Text" xml:space="preserve">
<value>Kosongkan baris gilir main</value> <value>Kosongkan baris gilir main</value>
</data> </data>
@@ -420,9 +429,6 @@
<data name="MusicGalleryPageFileArtist.Header" xml:space="preserve"> <data name="MusicGalleryPageFileArtist.Header" xml:space="preserve">
<value>Artis</value> <value>Artis</value>
</data> </data>
<data name="MusicGalleryPageFileInfo.Text" xml:space="preserve">
<value>Info Fail</value>
</data>
<data name="MusicGalleryPageFileInfoBitDepth.Header" xml:space="preserve"> <data name="MusicGalleryPageFileInfoBitDepth.Header" xml:space="preserve">
<value>Kedalaman Bit</value> <value>Kedalaman Bit</value>
</data> </data>
@@ -456,15 +462,15 @@
<data name="MusicGalleryPageFileNotFound.Text" xml:space="preserve"> <data name="MusicGalleryPageFileNotFound.Text" xml:space="preserve">
<value>Tiada lagu ditemui dalam pustaka media</value> <value>Tiada lagu ditemui dalam pustaka media</value>
</data> </data>
<data name="MusicGalleryPageFolder.Text" xml:space="preserve">
<value>Folder</value>
</data>
<data name="MusicGalleryPageImportFromFile.Text" xml:space="preserve"> <data name="MusicGalleryPageImportFromFile.Text" xml:space="preserve">
<value>Import dari fail</value> <value>Import dari fail</value>
</data> </data>
<data name="MusicGalleryPageNewPlaylist.Text" xml:space="preserve"> <data name="MusicGalleryPageNewPlaylist.Text" xml:space="preserve">
<value>Cipta senarai main</value> <value>Cipta senarai main</value>
</data> </data>
<data name="MusicGalleryPagePlayAll.Content" xml:space="preserve">
<value>Mainkan Semua</value>
</data>
<data name="MusicGalleryPagePlayingQueue.Text" xml:space="preserve"> <data name="MusicGalleryPagePlayingQueue.Text" xml:space="preserve">
<value>Baris Gilir Main</value> <value>Baris Gilir Main</value>
</data> </data>
@@ -489,9 +495,6 @@
<data name="MusicGalleryPageScrollToPlayingItem.Text" xml:space="preserve"> <data name="MusicGalleryPageScrollToPlayingItem.Text" xml:space="preserve">
<value>Tatal ke item yang dimainkan</value> <value>Tatal ke item yang dimainkan</value>
</data> </data>
<data name="MusicGalleryPageSelectAll.Content" xml:space="preserve">
<value>Pilih Semua</value>
</data>
<data name="MusicGalleryPageSingleLoop.Text" xml:space="preserve"> <data name="MusicGalleryPageSingleLoop.Text" xml:space="preserve">
<value>Gelung tunggal</value> <value>Gelung tunggal</value>
</data> </data>
@@ -513,20 +516,29 @@
<data name="MusicGalleryPageSortType.Text" xml:space="preserve"> <data name="MusicGalleryPageSortType.Text" xml:space="preserve">
<value>Jenis Susunan</value> <value>Jenis Susunan</value>
</data> </data>
<data name="MusicGalleryPageStarredPlaylist.Content" xml:space="preserve">
<value>Senarai Main Berbintang</value>
</data>
<data name="MusicGalleryPageStopTrack.Text" xml:space="preserve"> <data name="MusicGalleryPageStopTrack.Text" xml:space="preserve">
<value>Berhenti</value> <value>Berhenti</value>
</data> </data>
<data name="MusicGalleryPageTitle" xml:space="preserve"> <data name="MusicGalleryPageTitle" xml:space="preserve">
<value>Galeri Muzik - BetterLyrics</value> <value>Galeri Muzik - BetterLyrics</value>
</data> </data>
<data name="MusicGalleryWindowDownButtonToolTip.Content" xml:space="preserve"> <data name="MusicSettingsControlAutoSyncInterval.Header" xml:space="preserve">
<value>Tarik balik</value> <value>Kekerapan penyegerakan automatik</value>
</data> </data>
<data name="MusicGalleryWindowUpButtonToolTip.Content" xml:space="preserve"> <data name="MusicSettingsControlAutoSyncIntervalDisabled.Content" xml:space="preserve">
<value>Kembangkan</value> <value>Tak pernah</value>
</data>
<data name="MusicSettingsControlAutoSyncIntervalEveryDay.Content" xml:space="preserve">
<value>Setiap Hari</value>
</data>
<data name="MusicSettingsControlAutoSyncIntervalEveryFifteenMin.Content" xml:space="preserve">
<value>Setiap 15 minit</value>
</data>
<data name="MusicSettingsControlAutoSyncIntervalEveryHour.Content" xml:space="preserve">
<value>Setiap jam</value>
</data>
<data name="MusicSettingsControlAutoSyncIntervalEverySixHrs.Content" xml:space="preserve">
<value>Setiap 6 Jam</value>
</data> </data>
<data name="NarrowMode" xml:space="preserve"> <data name="NarrowMode" xml:space="preserve">
<value>Mod Sempit</value> <value>Mod Sempit</value>
@@ -543,12 +555,27 @@
<data name="PrivacyPolicy.Content" xml:space="preserve"> <data name="PrivacyPolicy.Content" xml:space="preserve">
<value>Dasar Privasi</value> <value>Dasar Privasi</value>
</data> </data>
<data name="RemoteServerConfigControlBrowse.Content" xml:space="preserve">
<value>Layari</value>
</data>
<data name="RemoteServerConfigControlName.Header" xml:space="preserve">
<value>Nama</value>
</data>
<data name="RemoteServerConfigControlName.PlaceholderText" xml:space="preserve">
<value>Membiarkan ia kosong akan menjana nama lalai secara automatik.</value>
</data>
<data name="RemoteServerConfigControlPassword.Header" xml:space="preserve"> <data name="RemoteServerConfigControlPassword.Header" xml:space="preserve">
<value>Kata Laluan</value> <value>Kata Laluan</value>
</data> </data>
<data name="RemoteServerConfigControlPath.Header" xml:space="preserve"> <data name="RemoteServerConfigControlPath.Header" xml:space="preserve">
<value>Laluan</value> <value>Laluan</value>
</data> </data>
<data name="RemoteServerConfigControlPathNotExisted" xml:space="preserve">
<value>Laluan folder yang dinyatakan tidak dapat ditemui</value>
</data>
<data name="RemoteServerConfigControlPathRequired" xml:space="preserve">
<value>Laluan diperlukan</value>
</data>
<data name="RemoteServerConfigControlPort.Header" xml:space="preserve"> <data name="RemoteServerConfigControlPort.Header" xml:space="preserve">
<value>Port</value> <value>Port</value>
</data> </data>
@@ -576,9 +603,6 @@
<data name="SetingsPageFeedback.Text" xml:space="preserve"> <data name="SetingsPageFeedback.Text" xml:space="preserve">
<value>Maklum Balas</value> <value>Maklum Balas</value>
</data> </data>
<data name="SetingsPageInstructions.Text" xml:space="preserve">
<value>Panduan Penggunaan</value>
</data>
<data name="SetingsPageSpecialThanks.Text" xml:space="preserve"> <data name="SetingsPageSpecialThanks.Text" xml:space="preserve">
<value>Penghargaan Khas</value> <value>Penghargaan Khas</value>
</data> </data>
@@ -606,9 +630,6 @@
<data name="SettingsPageAddFolderButton.Content" xml:space="preserve"> <data name="SettingsPageAddFolderButton.Content" xml:space="preserve">
<value>Tambah</value> <value>Tambah</value>
</data> </data>
<data name="SettingsPageAdvanced.Text" xml:space="preserve">
<value>Pilihan Lanjutan</value>
</data>
<data name="SettingsPageAlbum.Header" xml:space="preserve"> <data name="SettingsPageAlbum.Header" xml:space="preserve">
<value>Album</value> <value>Album</value>
</data> </data>
@@ -624,15 +645,9 @@
<data name="SettingsPageAlbumArtSearchProvidersConfig.Text" xml:space="preserve"> <data name="SettingsPageAlbumArtSearchProvidersConfig.Text" xml:space="preserve">
<value>Konfigurasi Sumber Seni Album</value> <value>Konfigurasi Sumber Seni Album</value>
</data> </data>
<data name="SettingsPageAlbumArtSize.Header" xml:space="preserve">
<value>Saiz Seni Album</value>
</data>
<data name="SettingsPageAlbumEffect.Text" xml:space="preserve"> <data name="SettingsPageAlbumEffect.Text" xml:space="preserve">
<value>Kesan Seni Album</value> <value>Kesan Seni Album</value>
</data> </data>
<data name="SettingsPageAlbumLib.Content" xml:space="preserve">
<value>Sumber Seni Album</value>
</data>
<data name="SettingsPageAlbumRadius.Header" xml:space="preserve"> <data name="SettingsPageAlbumRadius.Header" xml:space="preserve">
<value>Jejari Sudut</value> <value>Jejari Sudut</value>
</data> </data>
@@ -663,12 +678,6 @@
<data name="SettingsPageAppAppearance.Text" xml:space="preserve"> <data name="SettingsPageAppAppearance.Text" xml:space="preserve">
<value>Rupa Aplikasi</value> <value>Rupa Aplikasi</value>
</data> </data>
<data name="SettingsPageAppBehavior.Text" xml:space="preserve">
<value>Kelakuan Umum</value>
</data>
<data name="SettingsPageApply.Content" xml:space="preserve">
<value>Terapkan</value>
</data>
<data name="SettingsPageArtist.Header" xml:space="preserve"> <data name="SettingsPageArtist.Header" xml:space="preserve">
<value>Artis</value> <value>Artis</value>
</data> </data>
@@ -687,23 +696,14 @@
<data name="SettingsPageAutoStart.Header" xml:space="preserve"> <data name="SettingsPageAutoStart.Header" xml:space="preserve">
<value>Mula Automatik</value> <value>Mula Automatik</value>
</data> </data>
<data name="SettingsPageAutoStartWindow.Header" xml:space="preserve">
<value>Semasa memulakan aplikasi</value>
</data>
<data name="SettingsPageBackdrop.Header" xml:space="preserve">
<value>Bahan Latar Belakang Lirik</value>
</data>
<data name="SettingsPageBackgroundOverlay.Text" xml:space="preserve"> <data name="SettingsPageBackgroundOverlay.Text" xml:space="preserve">
<value>Latar Belakang Lirik</value> <value>Latar Belakang Lirik</value>
</data> </data>
<data name="SettingsPageBlurAmount.Header" xml:space="preserve"> <data name="SettingsPageBlurAmount.Header" xml:space="preserve">
<value>Jumlah Kabur</value> <value>Jumlah Kabur</value>
</data> </data>
<data name="SettingsPageBorderless.Header" xml:space="preserve">
<value>Tetingkap Tanpa Sempadan</value>
</data>
<data name="SettingsPageCache.Description" xml:space="preserve"> <data name="SettingsPageCache.Description" xml:space="preserve">
<value>Termasuk fail log, cache lirik rangkaian</value> <value>Termasuk fail log, cache lirik dalam talian</value>
</data> </data>
<data name="SettingsPageCache.Header" xml:space="preserve"> <data name="SettingsPageCache.Header" xml:space="preserve">
<value>Cache</value> <value>Cache</value>
@@ -738,9 +738,6 @@
<data name="SettingsPageCollapseDropdown.Content" xml:space="preserve"> <data name="SettingsPageCollapseDropdown.Content" xml:space="preserve">
<value>Runtuhkan Pilihan</value> <value>Runtuhkan Pilihan</value>
</data> </data>
<data name="SettingsPageCompactTitleBar.Content" xml:space="preserve">
<value>Kompak</value>
</data>
<data name="SettingsPageConfigName.Description" xml:space="preserve"> <data name="SettingsPageConfigName.Description" xml:space="preserve">
<value>Menamakan status tetingkap yang direkodkan boleh membantu anda membezakannya dengan lebih baik</value> <value>Menamakan status tetingkap yang direkodkan boleh membantu anda membezakannya dengan lebih baik</value>
</data> </data>
@@ -759,18 +756,12 @@
<data name="SettingsPageCrossfade.Content" xml:space="preserve"> <data name="SettingsPageCrossfade.Content" xml:space="preserve">
<value>Resap Silang (Crossfade)</value> <value>Resap Silang (Crossfade)</value>
</data> </data>
<data name="SettingsPageCurrentLyricsWindowStatus.Text" xml:space="preserve">
<value>Status Tetingkap Lirik Semasa</value>
</data>
<data name="SettingsPageCutletDockerServer.Header" xml:space="preserve"> <data name="SettingsPageCutletDockerServer.Header" xml:space="preserve">
<value>Perkhidmatan Transliterasi cutlet-docker</value> <value>Perkhidmatan Transliterasi cutlet-docker</value>
</data> </data>
<data name="SettingsPageDark.Content" xml:space="preserve"> <data name="SettingsPageDark.Content" xml:space="preserve">
<value>Gelap</value> <value>Gelap</value>
</data> </data>
<data name="SettingsPageDebugOverlay.Header" xml:space="preserve">
<value>Tunjukkan Lapisan Debug</value>
</data>
<data name="SettingsPageDelete.Text" xml:space="preserve"> <data name="SettingsPageDelete.Text" xml:space="preserve">
<value>Padam</value> <value>Padam</value>
</data> </data>
@@ -801,15 +792,9 @@
<data name="SettingsPageDockPlacementTop.Content" xml:space="preserve"> <data name="SettingsPageDockPlacementTop.Content" xml:space="preserve">
<value>Atas</value> <value>Atas</value>
</data> </data>
<data name="SettingsPageDockWindowHeight.Header" xml:space="preserve">
<value>Ketinggian Tetingkap</value>
</data>
<data name="SettingsPageDragArea.Header" xml:space="preserve"> <data name="SettingsPageDragArea.Header" xml:space="preserve">
<value>Kawasan Boleh Diseret</value> <value>Kawasan Boleh Diseret</value>
</data> </data>
<data name="SettingsPageEasingFuncType.Header" xml:space="preserve">
<value>Jenis Animasi Easing</value>
</data>
<data name="SettingsPageEasingTypeEaseInOutBack.Content" xml:space="preserve"> <data name="SettingsPageEasingTypeEaseInOutBack.Content" xml:space="preserve">
<value>EaseInOutBack</value> <value>EaseInOutBack</value>
</data> </data>
@@ -873,18 +858,15 @@
<data name="SettingsPageExitOnLyricsWindowClosed.Header" xml:space="preserve"> <data name="SettingsPageExitOnLyricsWindowClosed.Header" xml:space="preserve">
<value>Keluar dari program apabila tetingkap lirik ditutup</value> <value>Keluar dari program apabila tetingkap lirik ditutup</value>
</data> </data>
<data name="SettingsPageExportPlayHistoryButton.Content" xml:space="preserve">
<value>Eksport sejarah main</value>
</data>
<data name="SettingsPageExportSettingsButton.Content" xml:space="preserve"> <data name="SettingsPageExportSettingsButton.Content" xml:space="preserve">
<value>Eksport Tetapan</value> <value>Eksport Tetapan</value>
</data> </data>
<data name="SettingsPageExtendedTitleBar.Content" xml:space="preserve">
<value>Dilanjutkan</value>
</data>
<data name="SettingsPageFan.Header" xml:space="preserve"> <data name="SettingsPageFan.Header" xml:space="preserve">
<value>Lirik Kipas</value> <value>Lirik Kipas</value>
</data> </data>
<data name="SettingsPageFAQ.Content" xml:space="preserve">
<value>Soalan Lazim</value>
</data>
<data name="SettingsPageFixedTimeStep.Header" xml:space="preserve"> <data name="SettingsPageFixedTimeStep.Header" xml:space="preserve">
<value>Penyajian Langkah Masa Tetap</value> <value>Penyajian Langkah Masa Tetap</value>
</data> </data>
@@ -921,9 +903,6 @@
<data name="SettingsPageHeight.Header" xml:space="preserve"> <data name="SettingsPageHeight.Header" xml:space="preserve">
<value>Ketinggian</value> <value>Ketinggian</value>
</data> </data>
<data name="SettingsPageHello.Text" xml:space="preserve">
<value>Helo</value>
</data>
<data name="SettingsPageHelpUsTranslate.Content" xml:space="preserve"> <data name="SettingsPageHelpUsTranslate.Content" xml:space="preserve">
<value>Bantu kami menterjemah aplikasi ini</value> <value>Bantu kami menterjemah aplikasi ini</value>
</data> </data>
@@ -954,9 +933,6 @@
<data name="SettingsPageJapanese.Header" xml:space="preserve"> <data name="SettingsPageJapanese.Header" xml:space="preserve">
<value>Fonetik Bahasa Jepun</value> <value>Fonetik Bahasa Jepun</value>
</data> </data>
<data name="SettingsPageJoinNowButton.Content" xml:space="preserve">
<value>Sertai Sekarang</value>
</data>
<data name="SettingsPageJyutping.Content" xml:space="preserve"> <data name="SettingsPageJyutping.Content" xml:space="preserve">
<value>Jyutping (Kantonis)</value> <value>Jyutping (Kantonis)</value>
</data> </data>
@@ -1005,18 +981,12 @@
<data name="SettingsPageLight.Content" xml:space="preserve"> <data name="SettingsPageLight.Content" xml:space="preserve">
<value>Terang</value> <value>Terang</value>
</data> </data>
<data name="SettingsPageLinkedFile.Text" xml:space="preserve">
<value>Fail Tempatan Terpaut</value>
</data>
<data name="SettingsPageListenNewSession.Header" xml:space="preserve"> <data name="SettingsPageListenNewSession.Header" xml:space="preserve">
<value>Dayakan mendengar sumber main balik baharu</value> <value>Dayakan mendengar sumber main balik baharu</value>
</data> </data>
<data name="SettingsPageLocalFolder.Text" xml:space="preserve"> <data name="SettingsPageLocalFolder.Text" xml:space="preserve">
<value>Folder Tempatan</value> <value>Folder Tempatan</value>
</data> </data>
<data name="SettingsPageLog.Header" xml:space="preserve">
<value>Pembalakan (Logging)</value>
</data>
<data name="SettingsPageLongSyllableDuration.Header" xml:space="preserve"> <data name="SettingsPageLongSyllableDuration.Header" xml:space="preserve">
<value>Ambang Suku Kata Panjang</value> <value>Ambang Suku Kata Panjang</value>
</data> </data>
@@ -1071,15 +1041,6 @@
<data name="SettingsPageLyricsFgFontColor.Header" xml:space="preserve"> <data name="SettingsPageLyricsFgFontColor.Header" xml:space="preserve">
<value>Baris Semasa</value> <value>Baris Semasa</value>
</data> </data>
<data name="SettingsPageLyricsFgFontColorAdaptiveColored.Content" xml:space="preserve">
<value>Adaptif kepada Latar Belakang Lirik (Berwarna)</value>
</data>
<data name="SettingsPageLyricsFgFontColorAdaptiveGrayed.Content" xml:space="preserve">
<value>Adaptif kepada Latar Belakang Lirik (Kelabu)</value>
</data>
<data name="SettingsPageLyricsFgFontColorCustom.Content" xml:space="preserve">
<value>Tersuai</value>
</data>
<data name="SettingsPageLyricsFloatAnimation.Header" xml:space="preserve"> <data name="SettingsPageLyricsFloatAnimation.Header" xml:space="preserve">
<value>Animasi Terapung</value> <value>Animasi Terapung</value>
</data> </data>
@@ -1107,27 +1068,12 @@
<data name="SettingsPageLyricsGlowEffect.Header" xml:space="preserve"> <data name="SettingsPageLyricsGlowEffect.Header" xml:space="preserve">
<value>Kesan Bersinar</value> <value>Kesan Bersinar</value>
</data> </data>
<data name="SettingsPageLyricsHighlight.Header" xml:space="preserve">
<value>Sorotan</value>
</data>
<data name="SettingsPageLyricsHighlightScope.Header" xml:space="preserve">
<value>Skop Sorotan Teks Asal</value>
</data>
<data name="SettingsPageLyricsLeft.Content" xml:space="preserve">
<value>Kiri</value>
</data>
<data name="SettingsPageLyricsLight.Content" xml:space="preserve"> <data name="SettingsPageLyricsLight.Content" xml:space="preserve">
<value>Nipis</value> <value>Nipis</value>
</data> </data>
<data name="SettingsPageLyricsLineFade.Header" xml:space="preserve">
<value>Gradien Tepi Kawasan Main Balik</value>
</data>
<data name="SettingsPageLyricsLineSpacingFactor.Header" xml:space="preserve"> <data name="SettingsPageLyricsLineSpacingFactor.Header" xml:space="preserve">
<value>Jarak Baris</value> <value>Jarak Baris</value>
</data> </data>
<data name="SettingsPageLyricsLineSpacingFactorUnit.Text" xml:space="preserve">
<value> kali ketinggian baris</value>
</data>
<data name="SettingsPageLyricsMedium.Content" xml:space="preserve"> <data name="SettingsPageLyricsMedium.Content" xml:space="preserve">
<value>Sederhana</value> <value>Sederhana</value>
</data> </data>
@@ -1170,9 +1116,6 @@
<data name="SettingsPageLyricsSemiLight.Content" xml:space="preserve"> <data name="SettingsPageLyricsSemiLight.Content" xml:space="preserve">
<value>Separa Nipis</value> <value>Separa Nipis</value>
</data> </data>
<data name="SettingsPageLyricsShadow.Header" xml:space="preserve">
<value>Bayang</value>
</data>
<data name="SettingsPageLyricsStyle.Text" xml:space="preserve"> <data name="SettingsPageLyricsStyle.Text" xml:space="preserve">
<value>Gaya Lirik</value> <value>Gaya Lirik</value>
</data> </data>
@@ -1188,30 +1131,15 @@
<data name="SettingsPageLyricsTimelineThreshold.Header" xml:space="preserve"> <data name="SettingsPageLyricsTimelineThreshold.Header" xml:space="preserve">
<value>Ambang Penyegerakan Garis Masa Lirik</value> <value>Ambang Penyegerakan Garis Masa Lirik</value>
</data> </data>
<data name="SettingsPageLyricsTranslationHighlight.Header" xml:space="preserve">
<value>Sorotan Terjemahan</value>
</data>
<data name="SettingsPageLyricsTranslationSeparator.Header" xml:space="preserve">
<value>Pemisah Teks Asal dan Terjemahan</value>
</data>
<data name="SettingsPageLyricsVerticalEdgeOpacity.Header" xml:space="preserve">
<value>Kelegapan Tepi Menegak</value>
</data>
<data name="SettingsPageLyricsWindow.Text" xml:space="preserve"> <data name="SettingsPageLyricsWindow.Text" xml:space="preserve">
<value>Tetingkap Lirik</value> <value>Tetingkap Lirik</value>
</data> </data>
<data name="SettingsPageLyricsWindowManager.Text" xml:space="preserve">
<value>Pengurus Tetingkap Lirik</value>
</data>
<data name="SettingsPageLyricsWindowMgr.Content" xml:space="preserve"> <data name="SettingsPageLyricsWindowMgr.Content" xml:space="preserve">
<value>Pengurus Tetingkap Lirik</value> <value>Pengurus Tetingkap Lirik</value>
</data> </data>
<data name="SettingsPageLyricsWindowSwitchHotKey.Header" xml:space="preserve"> <data name="SettingsPageLyricsWindowSwitchHotKey.Header" xml:space="preserve">
<value>Pintasan Tukar Status Tetingkap Lirik</value> <value>Pintasan Tukar Status Tetingkap Lirik</value>
</data> </data>
<data name="SettingsPageLyricsWindowToolTip.Content" xml:space="preserve">
<value>Tetingkap Lirik</value>
</data>
<data name="SettingsPageMatchingThreshold.Description" xml:space="preserve"> <data name="SettingsPageMatchingThreshold.Description" xml:space="preserve">
<value>Melaraskan nilai ini akan mempengaruhi hasil carian jujukan dan carian padanan terbaik, tetapi tidak akan mempengaruhi hasil carian dalam antara muka carian lirik manual</value> <value>Melaraskan nilai ini akan mempengaruhi hasil carian jujukan dan carian padanan terbaik, tetapi tidak akan mempengaruhi hasil carian dalam antara muka carian lirik manual</value>
</data> </data>
@@ -1248,18 +1176,12 @@
<data name="SettingsPageMusicLib.Header" xml:space="preserve"> <data name="SettingsPageMusicLib.Header" xml:space="preserve">
<value>Pustaka Media Tempatan</value> <value>Pustaka Media Tempatan</value>
</data> </data>
<data name="SettingsPageMusicLibRealTimeWatch.Header" xml:space="preserve">
<value>Pemantauan Perubahan Fail Masa Nyata</value>
</data>
<data name="SettingsPageNarrowMode.Text" xml:space="preserve"> <data name="SettingsPageNarrowMode.Text" xml:space="preserve">
<value>Mod Sempit</value> <value>Mod Sempit</value>
</data> </data>
<data name="SettingsPageNextSongHotKey.Header" xml:space="preserve"> <data name="SettingsPageNextSongHotKey.Header" xml:space="preserve">
<value>Pintasan Lagu Seterusnya</value> <value>Pintasan Lagu Seterusnya</value>
</data> </data>
<data name="SettingsPageNoBackdrop.Content" xml:space="preserve">
<value>Tiada</value>
</data>
<data name="SettingsPageOctTree.Content" xml:space="preserve"> <data name="SettingsPageOctTree.Content" xml:space="preserve">
<value>Agresif</value> <value>Agresif</value>
</data> </data>
@@ -1287,9 +1209,6 @@
<data name="SettingsPagePathIncludingOthersInfo" xml:space="preserve"> <data name="SettingsPagePathIncludingOthersInfo" xml:space="preserve">
<value>Folder ini mengandungi folder yang sudah ditambah, sila padam folder tersebut untuk menambah folder ini</value> <value>Folder ini mengandungi folder yang sudah ditambah, sila padam folder tersebut untuk menambah folder ini</value>
</data> </data>
<data name="SettingsPagePathNotFound.Text" xml:space="preserve">
<value>Tidak dapat mencari laluan dalam komputer anda</value>
</data>
<data name="SettingsPagePatrons.Text" xml:space="preserve"> <data name="SettingsPagePatrons.Text" xml:space="preserve">
<value>Penaja</value> <value>Penaja</value>
</data> </data>
@@ -1335,15 +1254,9 @@
<data name="SettingsPageRealtimeStatus.Text" xml:space="preserve"> <data name="SettingsPageRealtimeStatus.Text" xml:space="preserve">
<value>Status Masa Nyata</value> <value>Status Masa Nyata</value>
</data> </data>
<data name="SettingsPageRecord.Content" xml:space="preserve">
<value>Rekod</value>
</data>
<data name="SettingsPageRecordedWindowStatus.Text" xml:space="preserve"> <data name="SettingsPageRecordedWindowStatus.Text" xml:space="preserve">
<value>Status Tetingkap Direkodkan</value> <value>Status Tetingkap Direkodkan</value>
</data> </data>
<data name="SettingsPageReference.Header" xml:space="preserve">
<value>Pautan Rujukan</value>
</data>
<data name="SettingsPageRefreshDropdown.Content" xml:space="preserve"> <data name="SettingsPageRefreshDropdown.Content" xml:space="preserve">
<value>Segarkan Pilihan</value> <value>Segarkan Pilihan</value>
</data> </data>
@@ -1362,9 +1275,6 @@
<data name="SettingsPageRight.Content" xml:space="preserve"> <data name="SettingsPageRight.Content" xml:space="preserve">
<value>Kanan</value> <value>Kanan</value>
</data> </data>
<data name="SettingsPageRomaji.Header" xml:space="preserve">
<value>Fonetik Bahasa Jepun</value>
</data>
<data name="SettingsPageScope.Header" xml:space="preserve"> <data name="SettingsPageScope.Header" xml:space="preserve">
<value>Skop</value> <value>Skop</value>
</data> </data>
@@ -1404,6 +1314,9 @@
<data name="SettingsPageSettingsManager.Header" xml:space="preserve"> <data name="SettingsPageSettingsManager.Header" xml:space="preserve">
<value>Pengurus Tetapan</value> <value>Pengurus Tetapan</value>
</data> </data>
<data name="SettingsPageSettingsPlayHistory.Header" xml:space="preserve">
<value>Sejarah Main</value>
</data>
<data name="SettingsPageShareHub.Content" xml:space="preserve"> <data name="SettingsPageShareHub.Content" xml:space="preserve">
<value>Layari Hab Perkongsian Sumber Dalam Talian</value> <value>Layari Hab Perkongsian Sumber Dalam Talian</value>
</data> </data>
@@ -1431,18 +1344,12 @@
<data name="SettingsPageShowInSwitchers.Header" xml:space="preserve"> <data name="SettingsPageShowInSwitchers.Header" xml:space="preserve">
<value>Tunjukkan dalam Persekitaran Sistem</value> <value>Tunjukkan dalam Persekitaran Sistem</value>
</data> </data>
<data name="SettingsPageShowLayoutDragger.Header" xml:space="preserve">
<value>Tunjukkan Pemisah Susun Atur</value>
</data>
<data name="SettingsPageShowTitle.Header" xml:space="preserve"> <data name="SettingsPageShowTitle.Header" xml:space="preserve">
<value>Tunjukkan Tajuk</value> <value>Tunjukkan Tajuk</value>
</data> </data>
<data name="SettingsPageSlide.Content" xml:space="preserve"> <data name="SettingsPageSlide.Content" xml:space="preserve">
<value>Gelongsor (Slide)</value> <value>Gelongsor (Slide)</value>
</data> </data>
<data name="SettingsPageSliderPrefix.Text" xml:space="preserve">
<value>Nilai semasa: </value>
</data>
<data name="SettingsPageSnowFlakeLayer.Header" xml:space="preserve"> <data name="SettingsPageSnowFlakeLayer.Header" xml:space="preserve">
<value>Lapisan Kepingan Salji</value> <value>Lapisan Kepingan Salji</value>
</data> </data>
@@ -1485,6 +1392,9 @@
<data name="SettingsPageStartup.Text" xml:space="preserve"> <data name="SettingsPageStartup.Text" xml:space="preserve">
<value>Permulaan</value> <value>Permulaan</value>
</data> </data>
<data name="SettingsPageStats.Content" xml:space="preserve">
<value>Statistik</value>
</data>
<data name="SettingsPageStopTrackOnGalleryWindowClosed.Header" xml:space="preserve"> <data name="SettingsPageStopTrackOnGalleryWindowClosed.Header" xml:space="preserve">
<value>Hentikan main balik apabila tetingkap galeri muzik ditutup</value> <value>Hentikan main balik apabila tetingkap galeri muzik ditutup</value>
</data> </data>
@@ -1503,9 +1413,6 @@
<data name="SettingsPageTaskbarPlacement.Header" xml:space="preserve"> <data name="SettingsPageTaskbarPlacement.Header" xml:space="preserve">
<value>Posisi Pemasangan Bar Tugas</value> <value>Posisi Pemasangan Bar Tugas</value>
</data> </data>
<data name="SettingsPageThanksForPurchasing.Text" xml:space="preserve">
<value>Terima kasih kerana membeli BetterLyrics</value>
</data>
<data name="SettingsPageThanksList.Header" xml:space="preserve"> <data name="SettingsPageThanksList.Header" xml:space="preserve">
<value>Senarai Penghargaan</value> <value>Senarai Penghargaan</value>
</data> </data>
@@ -1524,12 +1431,6 @@
<data name="SettingsPageTitleBarAreaWhole.Content" xml:space="preserve"> <data name="SettingsPageTitleBarAreaWhole.Content" xml:space="preserve">
<value>Seluruh Tetingkap</value> <value>Seluruh Tetingkap</value>
</data> </data>
<data name="SettingsPageTitleBarType.Header" xml:space="preserve">
<value>Saiz Bar Tajuk</value>
</data>
<data name="SettingsPageToggleHotKey.Header" xml:space="preserve">
<value>Pintasan Masuk dan Keluar (Cut-in/out)</value>
</data>
<data name="SettingsPageTranslatedText.Header" xml:space="preserve"> <data name="SettingsPageTranslatedText.Header" xml:space="preserve">
<value>Terjemahan</value> <value>Terjemahan</value>
</data> </data>
@@ -1539,9 +1440,6 @@
<data name="SettingsPageTranslationConfig.Header" xml:space="preserve"> <data name="SettingsPageTranslationConfig.Header" xml:space="preserve">
<value>Perkhidmatan Terjemahan LibreTranslate</value> <value>Perkhidmatan Terjemahan LibreTranslate</value>
</data> </data>
<data name="SettingsPageTranslationInfoLink.Text" xml:space="preserve">
<value>Lawati https://github.com/LibreTranslate/LibreTranslate untuk tutorial pemasangan dan maklumat lanjut (perisian ini tidak mempunyai kaitan dengan perkhidmatan terjemahan tersebut)</value>
</data>
<data name="SettingsPageUserWhoPurchased.Text" xml:space="preserve"> <data name="SettingsPageUserWhoPurchased.Text" xml:space="preserve">
<value>dan pengguna yang membeli serta menyokong BetterLyrics</value> <value>dan pengguna yang membeli serta menyokong BetterLyrics</value>
</data> </data>
@@ -1554,9 +1452,6 @@
<data name="SettingsPageWidth.Header" xml:space="preserve"> <data name="SettingsPageWidth.Header" xml:space="preserve">
<value>Lebar</value> <value>Lebar</value>
</data> </data>
<data name="SettingsPageWindowBounds.Header" xml:space="preserve">
<value>Sempadan Tetingkap</value>
</data>
<data name="SettingsPageWorkArea.Description" xml:space="preserve"> <data name="SettingsPageWorkArea.Description" xml:space="preserve">
<value>Sebagai ruang kerja berasingan, dipasang di tepi atas/bawah skrin</value> <value>Sebagai ruang kerja berasingan, dipasang di tepi atas/bawah skrin</value>
</data> </data>
@@ -1572,6 +1467,39 @@
<data name="StandardMode" xml:space="preserve"> <data name="StandardMode" xml:space="preserve">
<value>Mod Standard</value> <value>Mod Standard</value>
</data> </data>
<data name="StatsDashboardControlSources.Text" xml:space="preserve">
<value>Sumber</value>
</data>
<data name="StatsDashboardControlThisMonth.Header" xml:space="preserve">
<value>Bulan Ini</value>
</data>
<data name="StatsDashboardControlThisQuarter.Header" xml:space="preserve">
<value>Suku Tahun Ini</value>
</data>
<data name="StatsDashboardControlThisWeek.Header" xml:space="preserve">
<value>Minggu Ini</value>
</data>
<data name="StatsDashboardControlThisYear.Header" xml:space="preserve">
<value>Tahun Ini</value>
</data>
<data name="StatsDashboardControlToday.Header" xml:space="preserve">
<value>Hari ini</value>
</data>
<data name="StatsDashboardControlTopArtists.Text" xml:space="preserve">
<value>Artis Teratas</value>
</data>
<data name="StatsDashboardControlTopSongs.Text" xml:space="preserve">
<value>Lagu top</value>
</data>
<data name="StatsDashboardControlTopSource.Text" xml:space="preserve">
<value>Sumber Utama</value>
</data>
<data name="StatsDashboardControlTotalDuration.Text" xml:space="preserve">
<value>Jumlah Tempoh</value>
</data>
<data name="StatsDashboardControlTracksPlayed.Text" xml:space="preserve">
<value>Trek Dimainkan</value>
</data>
<data name="SystemTrayExit.Text" xml:space="preserve"> <data name="SystemTrayExit.Text" xml:space="preserve">
<value>Keluar Program</value> <value>Keluar Program</value>
</data> </data>
@@ -1581,9 +1509,6 @@
<data name="SystemTrayMusicGallery.Text" xml:space="preserve"> <data name="SystemTrayMusicGallery.Text" xml:space="preserve">
<value>Buka Galeri Muzik</value> <value>Buka Galeri Muzik</value>
</data> </data>
<data name="SystemTrayPageTitle" xml:space="preserve">
<value>Dulang Sistem - BetterLyrics</value>
</data>
<data name="SystemTrayResetWindowPosition.Text" xml:space="preserve"> <data name="SystemTrayResetWindowPosition.Text" xml:space="preserve">
<value>Tetapkan Semula Kedudukan Tetingkap</value> <value>Tetapkan Semula Kedudukan Tetingkap</value>
</data> </data>

View File

@@ -129,21 +129,12 @@
<data name="AlbumArtSearchSMTCProvider" xml:space="preserve"> <data name="AlbumArtSearchSMTCProvider" xml:space="preserve">
<value>Leitor de música</value> <value>Leitor de música</value>
</data> </data>
<data name="AllLyricsSettingsControlPictureInPicture.Content" xml:space="preserve">
<value>Modo Picture-in-Picture</value>
</data>
<data name="AppSettingsControlGeneral.Text" xml:space="preserve"> <data name="AppSettingsControlGeneral.Text" xml:space="preserve">
<value>Janela</value> <value>Janela</value>
</data> </data>
<data name="ArtistsSplitHint.Text" xml:space="preserve"> <data name="ArtistsSplitHint.Text" xml:space="preserve">
<value>Ao introduzir vários artistas, utilize um dos seguintes separadores para os dividir (não misturar)</value> <value>Ao introduzir vários artistas, utilize um dos seguintes separadores para os dividir (não misturar)</value>
</data> </data>
<data name="BaseWindowHostInfoBarCheckBox.Content" xml:space="preserve">
<value>Não mostrar esta mensagem novamente</value>
</data>
<data name="BaseWindowMiniFlyoutItem.Text" xml:space="preserve">
<value>Modo Picture-in-Picture</value>
</data>
<data name="Cancel" xml:space="preserve"> <data name="Cancel" xml:space="preserve">
<value>Cancelar</value> <value>Cancelar</value>
</data> </data>
@@ -168,24 +159,45 @@
<data name="DockedMode" xml:space="preserve"> <data name="DockedMode" xml:space="preserve">
<value>Modo Acoplado</value> <value>Modo Acoplado</value>
</data> </data>
<data name="Error" xml:space="preserve">
<value>Erro</value>
</data>
<data name="ExportSettingsSuccess" xml:space="preserve"> <data name="ExportSettingsSuccess" xml:space="preserve">
<value>Exportação bem-sucedida</value> <value>Exportação bem-sucedida</value>
</data> </data>
<data name="FailToStartLXMusicServer" xml:space="preserve"> <data name="FailToStartLXMusicServer" xml:space="preserve">
<value>Não foi possível ligar ao servidor LX Music. Aceda a Definições - Fonte de Reprodução - LX Music - Servidor LX Music para verificar se a ligação foi introduzida corretamente</value> <value>Não foi possível ligar ao servidor LX Music. Aceda a Definições - Fonte de Reprodução - LX Music - Servidor LX Music para verificar se a ligação foi introduzida corretamente</value>
</data> </data>
<data name="FileSystemServiceCleaningCache" xml:space="preserve">
<value>Limpando o cache...</value>
</data>
<data name="FileSystemServiceConnectFailed" xml:space="preserve">
<value>Conexão falhou</value>
</data>
<data name="FileSystemServiceConnecting" xml:space="preserve">
<value>Conectandochar@@0</value>
</data>
<data name="FileSystemServiceFetchingFileList" xml:space="preserve">
<value>Buscando lista de arquivos...</value>
</data>
<data name="FileSystemServiceParsing" xml:space="preserve">
<value>Parsing...</value>
</data>
<data name="FileSystemServicePrepareToClean" xml:space="preserve">
<value>A preparar a limpeza da cache...</value>
</data>
<data name="FileSystemServiceReady" xml:space="preserve">
<value>Pronto</value>
</data>
<data name="FileSystemServiceRootDirectoryWarning" xml:space="preserve">
<value>O caminho do diretório raiz foi detectado. Um índice de disco completo pode conter um grande número de ficheiros não multimédia e fazer com que a pesquisa demore demasiado tempo. Recomenda-se a especificação de um subdiretório específico.</value>
</data>
<data name="FileSystemServiceWaitingForScan" xml:space="preserve">
<value>Aguardando verificação...</value>
</data>
<data name="FullscreenMode" xml:space="preserve"> <data name="FullscreenMode" xml:space="preserve">
<value>Modo de Ecrã Inteiro</value> <value>Modo de Ecrã Inteiro</value>
</data> </data>
<data name="HostWindowClickThroughButton.Content" xml:space="preserve">
<value>Bloquear</value>
</data>
<data name="HostWindowClickThroughFlyoutItem.Text" xml:space="preserve">
<value>Bloquear</value>
</data>
<data name="HostWindowLockToolTip.Text" xml:space="preserve">
<value>Bloquear</value>
</data>
<data name="HostWindowMusicGalleryButtonToolTip.Content" xml:space="preserve"> <data name="HostWindowMusicGalleryButtonToolTip.Content" xml:space="preserve">
<value>Galeria de Música</value> <value>Galeria de Música</value>
</data> </data>
@@ -204,9 +216,6 @@
<data name="Jyutping" xml:space="preserve"> <data name="Jyutping" xml:space="preserve">
<value>Jyutping (Cantonês)</value> <value>Jyutping (Cantonês)</value>
</data> </data>
<data name="KeepAtLeastOneStatusDefault" xml:space="preserve">
<value>Certifique-se de que pelo menos um estado está definido como predefinição</value>
</data>
<data name="LastFMAuthFailed" xml:space="preserve"> <data name="LastFMAuthFailed" xml:space="preserve">
<value>Autorização falhou, tente novamente</value> <value>Autorização falhou, tente novamente</value>
</data> </data>
@@ -270,18 +279,12 @@
<data name="LyricsPageSettings.Text" xml:space="preserve"> <data name="LyricsPageSettings.Text" xml:space="preserve">
<value>Definições</value> <value>Definições</value>
</data> </data>
<data name="LyricsPageTimelineOffsetButtonToolTip.Content" xml:space="preserve">
<value>Desvio da Linha de Tempo da Letra</value>
</data>
<data name="LyricsPageTranslationEnabled.Description" xml:space="preserve"> <data name="LyricsPageTranslationEnabled.Description" xml:space="preserve">
<value>Dará prioridade à leitura da tradução dentro da letra; se não houver correspondência, solicitará tradução automática ao servidor LibreTranslate</value> <value>Dará prioridade à leitura da tradução dentro da letra; se não houver correspondência, solicitará tradução automática ao servidor LibreTranslate</value>
</data> </data>
<data name="LyricsPageTranslationEnabled.Header" xml:space="preserve"> <data name="LyricsPageTranslationEnabled.Header" xml:space="preserve">
<value>Ativar Tradução</value> <value>Ativar Tradução</value>
</data> </data>
<data name="LyricsPageTranslationOnly.Header" xml:space="preserve">
<value>Mostrar Apenas Tradução</value>
</data>
<data name="LyricsPageTranslationProviderPrefix.Header" xml:space="preserve"> <data name="LyricsPageTranslationProviderPrefix.Header" xml:space="preserve">
<value>Fornecedor de Tradução</value> <value>Fornecedor de Tradução</value>
</data> </data>
@@ -330,9 +333,6 @@
<data name="LyricsSearchControlSongInfoMapping.Text" xml:space="preserve"> <data name="LyricsSearchControlSongInfoMapping.Text" xml:space="preserve">
<value>Mapeamento de Informações da Música</value> <value>Mapeamento de Informações da Música</value>
</data> </data>
<data name="LyricsSearchControlTargetSearchProvider.Header" xml:space="preserve">
<value>Fornecedor de Pesquisa de Letras Alvo</value>
</data>
<data name="LyricsSearchControlTitle.Header" xml:space="preserve"> <data name="LyricsSearchControlTitle.Header" xml:space="preserve">
<value>Título</value> <value>Título</value>
</data> </data>
@@ -351,15 +351,9 @@
<data name="LyricsSearchProviderTtmlFile" xml:space="preserve"> <data name="LyricsSearchProviderTtmlFile" xml:space="preserve">
<value>Ficheiro .TTML Local</value> <value>Ficheiro .TTML Local</value>
</data> </data>
<data name="LyricsWindowImmersiveButtonToolTip.Content" xml:space="preserve">
<value>Modo Imersivo</value>
</data>
<data name="LyricsWindowSettingsControlLyricsWindowConfig.Text" xml:space="preserve"> <data name="LyricsWindowSettingsControlLyricsWindowConfig.Text" xml:space="preserve">
<value>Configuração</value> <value>Configuração</value>
</data> </data>
<data name="LyricsWindowSettingsControlLyricsWindowMode.Header" xml:space="preserve">
<value>Modo da Janela de Letras</value>
</data>
<data name="LyricsWindowSettingsControlSetDefault.Text" xml:space="preserve"> <data name="LyricsWindowSettingsControlSetDefault.Text" xml:space="preserve">
<value>Definir como Predefinição</value> <value>Definir como Predefinição</value>
</data> </data>
@@ -378,9 +372,6 @@
<data name="MainPageAlbumArtOnly.Content" xml:space="preserve"> <data name="MainPageAlbumArtOnly.Content" xml:space="preserve">
<value>Mostrar apenas a área da capa do álbum</value> <value>Mostrar apenas a área da capa do álbum</value>
</data> </data>
<data name="MainPageEnterImmersiveModeHint" xml:space="preserve">
<value>Passe o rato novamente para mostrar o botão de alternância</value>
</data>
<data name="MainPageLyriscOnly.Content" xml:space="preserve"> <data name="MainPageLyriscOnly.Content" xml:space="preserve">
<value>Mostrar apenas a letra</value> <value>Mostrar apenas a letra</value>
</data> </data>
@@ -396,6 +387,18 @@
<data name="MainPageSplitView.Content" xml:space="preserve"> <data name="MainPageSplitView.Content" xml:space="preserve">
<value>Vista Dividida</value> <value>Vista Dividida</value>
</data> </data>
<data name="MediaSettingsControlLastSyncTime.Header" xml:space="preserve">
<value>Última sincronização</value>
</data>
<data name="MediaSettingsControlLocalFolder" xml:space="preserve">
<value>Pasta local</value>
</data>
<data name="MediaSettingsControlNameSetting.Header" xml:space="preserve">
<value>Nome</value>
</data>
<data name="MediaSettingsControlSyncNow.Content" xml:space="preserve">
<value>Sincronizar agora</value>
</data>
<data name="MusicGalleryPageAddToCustomList.Text" xml:space="preserve"> <data name="MusicGalleryPageAddToCustomList.Text" xml:space="preserve">
<value>Adicionar à lista de reprodução</value> <value>Adicionar à lista de reprodução</value>
</data> </data>
@@ -411,6 +414,12 @@
<data name="MusicGalleryPageAllSongs" xml:space="preserve"> <data name="MusicGalleryPageAllSongs" xml:space="preserve">
<value>Todas as Músicas</value> <value>Todas as Músicas</value>
</data> </data>
<data name="MusicGalleryPageDataSync.Message" xml:space="preserve">
<value>Sincronização da biblioteca multimédia em curso...</value>
</data>
<data name="MusicGalleryPageDataSyncError.Message" xml:space="preserve">
<value>Existe um problema com a sincronização da Biblioteca Multimédia</value>
</data>
<data name="MusicGalleryPageEmptyPlayingQueue.Text" xml:space="preserve"> <data name="MusicGalleryPageEmptyPlayingQueue.Text" xml:space="preserve">
<value>Limpar fila de reprodução</value> <value>Limpar fila de reprodução</value>
</data> </data>
@@ -420,9 +429,6 @@
<data name="MusicGalleryPageFileArtist.Header" xml:space="preserve"> <data name="MusicGalleryPageFileArtist.Header" xml:space="preserve">
<value>Artista</value> <value>Artista</value>
</data> </data>
<data name="MusicGalleryPageFileInfo.Text" xml:space="preserve">
<value>Informações do Ficheiro</value>
</data>
<data name="MusicGalleryPageFileInfoBitDepth.Header" xml:space="preserve"> <data name="MusicGalleryPageFileInfoBitDepth.Header" xml:space="preserve">
<value>Profundidade de Bits</value> <value>Profundidade de Bits</value>
</data> </data>
@@ -456,15 +462,15 @@
<data name="MusicGalleryPageFileNotFound.Text" xml:space="preserve"> <data name="MusicGalleryPageFileNotFound.Text" xml:space="preserve">
<value>Nenhuma música encontrada na biblioteca multimédia</value> <value>Nenhuma música encontrada na biblioteca multimédia</value>
</data> </data>
<data name="MusicGalleryPageFolder.Text" xml:space="preserve">
<value>Pastas</value>
</data>
<data name="MusicGalleryPageImportFromFile.Text" xml:space="preserve"> <data name="MusicGalleryPageImportFromFile.Text" xml:space="preserve">
<value>Importar de ficheiro</value> <value>Importar de ficheiro</value>
</data> </data>
<data name="MusicGalleryPageNewPlaylist.Text" xml:space="preserve"> <data name="MusicGalleryPageNewPlaylist.Text" xml:space="preserve">
<value>Criar lista de reprodução</value> <value>Criar lista de reprodução</value>
</data> </data>
<data name="MusicGalleryPagePlayAll.Content" xml:space="preserve">
<value>Reproduzir Tudo</value>
</data>
<data name="MusicGalleryPagePlayingQueue.Text" xml:space="preserve"> <data name="MusicGalleryPagePlayingQueue.Text" xml:space="preserve">
<value>Fila de Reprodução</value> <value>Fila de Reprodução</value>
</data> </data>
@@ -472,7 +478,7 @@
<value>A fila de reprodução está vazia</value> <value>A fila de reprodução está vazia</value>
</data> </data>
<data name="MusicGalleryPagePlaylist.Text" xml:space="preserve"> <data name="MusicGalleryPagePlaylist.Text" xml:space="preserve">
<value>Lista de Reprodução</value> <value>Listas de reprodução</value>
</data> </data>
<data name="MusicGalleryPageQueueLoop.Text" xml:space="preserve"> <data name="MusicGalleryPageQueueLoop.Text" xml:space="preserve">
<value>Ciclo da lista</value> <value>Ciclo da lista</value>
@@ -489,9 +495,6 @@
<data name="MusicGalleryPageScrollToPlayingItem.Text" xml:space="preserve"> <data name="MusicGalleryPageScrollToPlayingItem.Text" xml:space="preserve">
<value>Rolar para o item em reprodução</value> <value>Rolar para o item em reprodução</value>
</data> </data>
<data name="MusicGalleryPageSelectAll.Content" xml:space="preserve">
<value>Selecionar Tudo</value>
</data>
<data name="MusicGalleryPageSingleLoop.Text" xml:space="preserve"> <data name="MusicGalleryPageSingleLoop.Text" xml:space="preserve">
<value>Ciclo único</value> <value>Ciclo único</value>
</data> </data>
@@ -513,20 +516,29 @@
<data name="MusicGalleryPageSortType.Text" xml:space="preserve"> <data name="MusicGalleryPageSortType.Text" xml:space="preserve">
<value>Tipo de Ordenação</value> <value>Tipo de Ordenação</value>
</data> </data>
<data name="MusicGalleryPageStarredPlaylist.Content" xml:space="preserve">
<value>Listas de Reprodução com Estrela</value>
</data>
<data name="MusicGalleryPageStopTrack.Text" xml:space="preserve"> <data name="MusicGalleryPageStopTrack.Text" xml:space="preserve">
<value>Parar</value> <value>Parar</value>
</data> </data>
<data name="MusicGalleryPageTitle" xml:space="preserve"> <data name="MusicGalleryPageTitle" xml:space="preserve">
<value>Galeria de Música - BetterLyrics</value> <value>Galeria de Música - BetterLyrics</value>
</data> </data>
<data name="MusicGalleryWindowDownButtonToolTip.Content" xml:space="preserve"> <data name="MusicSettingsControlAutoSyncInterval.Header" xml:space="preserve">
<value>Recolher</value> <value>Frequência de sincronização automática</value>
</data> </data>
<data name="MusicGalleryWindowUpButtonToolTip.Content" xml:space="preserve"> <data name="MusicSettingsControlAutoSyncIntervalDisabled.Content" xml:space="preserve">
<value>Expandir</value> <value>nunca</value>
</data>
<data name="MusicSettingsControlAutoSyncIntervalEveryDay.Content" xml:space="preserve">
<value>Todos os dias</value>
</data>
<data name="MusicSettingsControlAutoSyncIntervalEveryFifteenMin.Content" xml:space="preserve">
<value>A cada 15 minutos</value>
</data>
<data name="MusicSettingsControlAutoSyncIntervalEveryHour.Content" xml:space="preserve">
<value>A cada hora</value>
</data>
<data name="MusicSettingsControlAutoSyncIntervalEverySixHrs.Content" xml:space="preserve">
<value>A cada 6 horas</value>
</data> </data>
<data name="NarrowMode" xml:space="preserve"> <data name="NarrowMode" xml:space="preserve">
<value>Modo Estreito</value> <value>Modo Estreito</value>
@@ -543,12 +555,27 @@
<data name="PrivacyPolicy.Content" xml:space="preserve"> <data name="PrivacyPolicy.Content" xml:space="preserve">
<value>Política de Privacidade</value> <value>Política de Privacidade</value>
</data> </data>
<data name="RemoteServerConfigControlBrowse.Content" xml:space="preserve">
<value>Navegar</value>
</data>
<data name="RemoteServerConfigControlName.Header" xml:space="preserve">
<value>Nome</value>
</data>
<data name="RemoteServerConfigControlName.PlaceholderText" xml:space="preserve">
<value>Se o deixar em branco, será gerado automaticamente um nome predefinido.</value>
</data>
<data name="RemoteServerConfigControlPassword.Header" xml:space="preserve"> <data name="RemoteServerConfigControlPassword.Header" xml:space="preserve">
<value>Palavra-passe</value> <value>Palavra-passe</value>
</data> </data>
<data name="RemoteServerConfigControlPath.Header" xml:space="preserve"> <data name="RemoteServerConfigControlPath.Header" xml:space="preserve">
<value>Caminho</value> <value>Caminho</value>
</data> </data>
<data name="RemoteServerConfigControlPathNotExisted" xml:space="preserve">
<value>Não foi possível encontrar o caminho da pasta especificada</value>
</data>
<data name="RemoteServerConfigControlPathRequired" xml:space="preserve">
<value>O caminho é necessário</value>
</data>
<data name="RemoteServerConfigControlPort.Header" xml:space="preserve"> <data name="RemoteServerConfigControlPort.Header" xml:space="preserve">
<value>Porta</value> <value>Porta</value>
</data> </data>
@@ -576,9 +603,6 @@
<data name="SetingsPageFeedback.Text" xml:space="preserve"> <data name="SetingsPageFeedback.Text" xml:space="preserve">
<value>Feedback</value> <value>Feedback</value>
</data> </data>
<data name="SetingsPageInstructions.Text" xml:space="preserve">
<value>Guia do Utilizador</value>
</data>
<data name="SetingsPageSpecialThanks.Text" xml:space="preserve"> <data name="SetingsPageSpecialThanks.Text" xml:space="preserve">
<value>Agradecimentos Especiais</value> <value>Agradecimentos Especiais</value>
</data> </data>
@@ -606,9 +630,6 @@
<data name="SettingsPageAddFolderButton.Content" xml:space="preserve"> <data name="SettingsPageAddFolderButton.Content" xml:space="preserve">
<value>Adicionar</value> <value>Adicionar</value>
</data> </data>
<data name="SettingsPageAdvanced.Text" xml:space="preserve">
<value>Opções Avançadas</value>
</data>
<data name="SettingsPageAlbum.Header" xml:space="preserve"> <data name="SettingsPageAlbum.Header" xml:space="preserve">
<value>Álbum</value> <value>Álbum</value>
</data> </data>
@@ -624,15 +645,9 @@
<data name="SettingsPageAlbumArtSearchProvidersConfig.Text" xml:space="preserve"> <data name="SettingsPageAlbumArtSearchProvidersConfig.Text" xml:space="preserve">
<value>Configurar Fontes da Capa do Álbum</value> <value>Configurar Fontes da Capa do Álbum</value>
</data> </data>
<data name="SettingsPageAlbumArtSize.Header" xml:space="preserve">
<value>Tamanho da Capa do Álbum</value>
</data>
<data name="SettingsPageAlbumEffect.Text" xml:space="preserve"> <data name="SettingsPageAlbumEffect.Text" xml:space="preserve">
<value>Efeito da Capa do Álbum</value> <value>Efeito da Capa do Álbum</value>
</data> </data>
<data name="SettingsPageAlbumLib.Content" xml:space="preserve">
<value>Fonte da Capa do Álbum</value>
</data>
<data name="SettingsPageAlbumRadius.Header" xml:space="preserve"> <data name="SettingsPageAlbumRadius.Header" xml:space="preserve">
<value>Raio do Canto</value> <value>Raio do Canto</value>
</data> </data>
@@ -663,12 +678,6 @@
<data name="SettingsPageAppAppearance.Text" xml:space="preserve"> <data name="SettingsPageAppAppearance.Text" xml:space="preserve">
<value>Aparência da Aplicação</value> <value>Aparência da Aplicação</value>
</data> </data>
<data name="SettingsPageAppBehavior.Text" xml:space="preserve">
<value>Comportamento Geral</value>
</data>
<data name="SettingsPageApply.Content" xml:space="preserve">
<value>Aplicar</value>
</data>
<data name="SettingsPageArtist.Header" xml:space="preserve"> <data name="SettingsPageArtist.Header" xml:space="preserve">
<value>Artista</value> <value>Artista</value>
</data> </data>
@@ -687,23 +696,14 @@
<data name="SettingsPageAutoStart.Header" xml:space="preserve"> <data name="SettingsPageAutoStart.Header" xml:space="preserve">
<value>Arranque Automático</value> <value>Arranque Automático</value>
</data> </data>
<data name="SettingsPageAutoStartWindow.Header" xml:space="preserve">
<value>Ao iniciar a aplicação</value>
</data>
<data name="SettingsPageBackdrop.Header" xml:space="preserve">
<value>Material de Fundo da Letra</value>
</data>
<data name="SettingsPageBackgroundOverlay.Text" xml:space="preserve"> <data name="SettingsPageBackgroundOverlay.Text" xml:space="preserve">
<value>Fundo da Letra</value> <value>Fundo da Letra</value>
</data> </data>
<data name="SettingsPageBlurAmount.Header" xml:space="preserve"> <data name="SettingsPageBlurAmount.Header" xml:space="preserve">
<value>Quantidade de Desfoque</value> <value>Quantidade de Desfoque</value>
</data> </data>
<data name="SettingsPageBorderless.Header" xml:space="preserve">
<value>Janela Sem Margens</value>
</data>
<data name="SettingsPageCache.Description" xml:space="preserve"> <data name="SettingsPageCache.Description" xml:space="preserve">
<value>Inclui ficheiros de registo e cache de letras da rede</value> <value>Inclui ficheiros de registo, cache de letras online</value>
</data> </data>
<data name="SettingsPageCache.Header" xml:space="preserve"> <data name="SettingsPageCache.Header" xml:space="preserve">
<value>Cache</value> <value>Cache</value>
@@ -738,9 +738,6 @@
<data name="SettingsPageCollapseDropdown.Content" xml:space="preserve"> <data name="SettingsPageCollapseDropdown.Content" xml:space="preserve">
<value>Recolher Menu Suspenso</value> <value>Recolher Menu Suspenso</value>
</data> </data>
<data name="SettingsPageCompactTitleBar.Content" xml:space="preserve">
<value>Compacto</value>
</data>
<data name="SettingsPageConfigName.Description" xml:space="preserve"> <data name="SettingsPageConfigName.Description" xml:space="preserve">
<value>Nomear o estado da janela gravado pode ajudá-lo a distingui-los melhor</value> <value>Nomear o estado da janela gravado pode ajudá-lo a distingui-los melhor</value>
</data> </data>
@@ -759,18 +756,12 @@
<data name="SettingsPageCrossfade.Content" xml:space="preserve"> <data name="SettingsPageCrossfade.Content" xml:space="preserve">
<value>Crossfade</value> <value>Crossfade</value>
</data> </data>
<data name="SettingsPageCurrentLyricsWindowStatus.Text" xml:space="preserve">
<value>Estado da Janela de Letras Atual</value>
</data>
<data name="SettingsPageCutletDockerServer.Header" xml:space="preserve"> <data name="SettingsPageCutletDockerServer.Header" xml:space="preserve">
<value>Serviço de Transliteração cutlet-docker</value> <value>Serviço de Transliteração cutlet-docker</value>
</data> </data>
<data name="SettingsPageDark.Content" xml:space="preserve"> <data name="SettingsPageDark.Content" xml:space="preserve">
<value>Escuro</value> <value>Escuro</value>
</data> </data>
<data name="SettingsPageDebugOverlay.Header" xml:space="preserve">
<value>Mostrar Sobreposição de Depuração</value>
</data>
<data name="SettingsPageDelete.Text" xml:space="preserve"> <data name="SettingsPageDelete.Text" xml:space="preserve">
<value>Eliminar</value> <value>Eliminar</value>
</data> </data>
@@ -801,15 +792,9 @@
<data name="SettingsPageDockPlacementTop.Content" xml:space="preserve"> <data name="SettingsPageDockPlacementTop.Content" xml:space="preserve">
<value>Superior</value> <value>Superior</value>
</data> </data>
<data name="SettingsPageDockWindowHeight.Header" xml:space="preserve">
<value>Altura da Janela</value>
</data>
<data name="SettingsPageDragArea.Header" xml:space="preserve"> <data name="SettingsPageDragArea.Header" xml:space="preserve">
<value>Área de Arrastar</value> <value>Área de Arrastar</value>
</data> </data>
<data name="SettingsPageEasingFuncType.Header" xml:space="preserve">
<value>Tipo de Animação de Suavização</value>
</data>
<data name="SettingsPageEasingTypeEaseInOutBack.Content" xml:space="preserve"> <data name="SettingsPageEasingTypeEaseInOutBack.Content" xml:space="preserve">
<value>EaseInOutBack</value> <value>EaseInOutBack</value>
</data> </data>
@@ -873,18 +858,15 @@
<data name="SettingsPageExitOnLyricsWindowClosed.Header" xml:space="preserve"> <data name="SettingsPageExitOnLyricsWindowClosed.Header" xml:space="preserve">
<value>Sair do programa ao fechar a janela de letras</value> <value>Sair do programa ao fechar a janela de letras</value>
</data> </data>
<data name="SettingsPageExportPlayHistoryButton.Content" xml:space="preserve">
<value>Exportar histórico de jogos</value>
</data>
<data name="SettingsPageExportSettingsButton.Content" xml:space="preserve"> <data name="SettingsPageExportSettingsButton.Content" xml:space="preserve">
<value>Exportar Definições</value> <value>Exportar Definições</value>
</data> </data>
<data name="SettingsPageExtendedTitleBar.Content" xml:space="preserve">
<value>Estendido</value>
</data>
<data name="SettingsPageFan.Header" xml:space="preserve"> <data name="SettingsPageFan.Header" xml:space="preserve">
<value>Letra em Leque</value> <value>Letra em Leque</value>
</data> </data>
<data name="SettingsPageFAQ.Content" xml:space="preserve">
<value>Perguntas Frequentes</value>
</data>
<data name="SettingsPageFixedTimeStep.Header" xml:space="preserve"> <data name="SettingsPageFixedTimeStep.Header" xml:space="preserve">
<value>Renderização de Passo de Tempo Fixo</value> <value>Renderização de Passo de Tempo Fixo</value>
</data> </data>
@@ -921,9 +903,6 @@
<data name="SettingsPageHeight.Header" xml:space="preserve"> <data name="SettingsPageHeight.Header" xml:space="preserve">
<value>Altura</value> <value>Altura</value>
</data> </data>
<data name="SettingsPageHello.Text" xml:space="preserve">
<value>Olá</value>
</data>
<data name="SettingsPageHelpUsTranslate.Content" xml:space="preserve"> <data name="SettingsPageHelpUsTranslate.Content" xml:space="preserve">
<value>Ajude-nos a traduzir esta aplicação</value> <value>Ajude-nos a traduzir esta aplicação</value>
</data> </data>
@@ -954,9 +933,6 @@
<data name="SettingsPageJapanese.Header" xml:space="preserve"> <data name="SettingsPageJapanese.Header" xml:space="preserve">
<value>Fonética Japonesa</value> <value>Fonética Japonesa</value>
</data> </data>
<data name="SettingsPageJoinNowButton.Content" xml:space="preserve">
<value>Aderir Agora</value>
</data>
<data name="SettingsPageJyutping.Content" xml:space="preserve"> <data name="SettingsPageJyutping.Content" xml:space="preserve">
<value>Jyutping (Cantonês)</value> <value>Jyutping (Cantonês)</value>
</data> </data>
@@ -1005,18 +981,12 @@
<data name="SettingsPageLight.Content" xml:space="preserve"> <data name="SettingsPageLight.Content" xml:space="preserve">
<value>Claro</value> <value>Claro</value>
</data> </data>
<data name="SettingsPageLinkedFile.Text" xml:space="preserve">
<value>Ficheiros Locais Vinculados</value>
</data>
<data name="SettingsPageListenNewSession.Header" xml:space="preserve"> <data name="SettingsPageListenNewSession.Header" xml:space="preserve">
<value>Ativar escuta de novas fontes de reprodução</value> <value>Ativar escuta de novas fontes de reprodução</value>
</data> </data>
<data name="SettingsPageLocalFolder.Text" xml:space="preserve"> <data name="SettingsPageLocalFolder.Text" xml:space="preserve">
<value>Pasta Local</value> <value>Pasta Local</value>
</data> </data>
<data name="SettingsPageLog.Header" xml:space="preserve">
<value>Registo (Log)</value>
</data>
<data name="SettingsPageLongSyllableDuration.Header" xml:space="preserve"> <data name="SettingsPageLongSyllableDuration.Header" xml:space="preserve">
<value>Limiar de Sílaba Longa</value> <value>Limiar de Sílaba Longa</value>
</data> </data>
@@ -1071,15 +1041,6 @@
<data name="SettingsPageLyricsFgFontColor.Header" xml:space="preserve"> <data name="SettingsPageLyricsFgFontColor.Header" xml:space="preserve">
<value>Linha Atual</value> <value>Linha Atual</value>
</data> </data>
<data name="SettingsPageLyricsFgFontColorAdaptiveColored.Content" xml:space="preserve">
<value>Adaptável ao fundo da letra (Colorido)</value>
</data>
<data name="SettingsPageLyricsFgFontColorAdaptiveGrayed.Content" xml:space="preserve">
<value>Adaptável ao fundo da letra (Acinzentado)</value>
</data>
<data name="SettingsPageLyricsFgFontColorCustom.Content" xml:space="preserve">
<value>Personalizado</value>
</data>
<data name="SettingsPageLyricsFloatAnimation.Header" xml:space="preserve"> <data name="SettingsPageLyricsFloatAnimation.Header" xml:space="preserve">
<value>Animação Flutuante</value> <value>Animação Flutuante</value>
</data> </data>
@@ -1107,27 +1068,12 @@
<data name="SettingsPageLyricsGlowEffect.Header" xml:space="preserve"> <data name="SettingsPageLyricsGlowEffect.Header" xml:space="preserve">
<value>Efeito de Brilho</value> <value>Efeito de Brilho</value>
</data> </data>
<data name="SettingsPageLyricsHighlight.Header" xml:space="preserve">
<value>Realçar</value>
</data>
<data name="SettingsPageLyricsHighlightScope.Header" xml:space="preserve">
<value>Âmbito do Realce do Texto Original</value>
</data>
<data name="SettingsPageLyricsLeft.Content" xml:space="preserve">
<value>Esquerda</value>
</data>
<data name="SettingsPageLyricsLight.Content" xml:space="preserve"> <data name="SettingsPageLyricsLight.Content" xml:space="preserve">
<value>Leve</value> <value>Leve</value>
</data> </data>
<data name="SettingsPageLyricsLineFade.Header" xml:space="preserve">
<value>Gradiente da Margem da Área de Reprodução</value>
</data>
<data name="SettingsPageLyricsLineSpacingFactor.Header" xml:space="preserve"> <data name="SettingsPageLyricsLineSpacingFactor.Header" xml:space="preserve">
<value>Espaçamento entre Linhas</value> <value>Espaçamento entre Linhas</value>
</data> </data>
<data name="SettingsPageLyricsLineSpacingFactorUnit.Text" xml:space="preserve">
<value> x altura da linha</value>
</data>
<data name="SettingsPageLyricsMedium.Content" xml:space="preserve"> <data name="SettingsPageLyricsMedium.Content" xml:space="preserve">
<value>Médio</value> <value>Médio</value>
</data> </data>
@@ -1170,9 +1116,6 @@
<data name="SettingsPageLyricsSemiLight.Content" xml:space="preserve"> <data name="SettingsPageLyricsSemiLight.Content" xml:space="preserve">
<value>Semi Leve</value> <value>Semi Leve</value>
</data> </data>
<data name="SettingsPageLyricsShadow.Header" xml:space="preserve">
<value>Sombra</value>
</data>
<data name="SettingsPageLyricsStyle.Text" xml:space="preserve"> <data name="SettingsPageLyricsStyle.Text" xml:space="preserve">
<value>Estilo da Letra</value> <value>Estilo da Letra</value>
</data> </data>
@@ -1188,30 +1131,15 @@
<data name="SettingsPageLyricsTimelineThreshold.Header" xml:space="preserve"> <data name="SettingsPageLyricsTimelineThreshold.Header" xml:space="preserve">
<value>Limiar de Sincronização da Linha de Tempo</value> <value>Limiar de Sincronização da Linha de Tempo</value>
</data> </data>
<data name="SettingsPageLyricsTranslationHighlight.Header" xml:space="preserve">
<value>Realce da Tradução</value>
</data>
<data name="SettingsPageLyricsTranslationSeparator.Header" xml:space="preserve">
<value>Separador Original-Tradução</value>
</data>
<data name="SettingsPageLyricsVerticalEdgeOpacity.Header" xml:space="preserve">
<value>Opacidade da Margem Vertical</value>
</data>
<data name="SettingsPageLyricsWindow.Text" xml:space="preserve"> <data name="SettingsPageLyricsWindow.Text" xml:space="preserve">
<value>Janela de Letras</value> <value>Janela de Letras</value>
</data> </data>
<data name="SettingsPageLyricsWindowManager.Text" xml:space="preserve">
<value>Gestor de Janelas de Letras</value>
</data>
<data name="SettingsPageLyricsWindowMgr.Content" xml:space="preserve"> <data name="SettingsPageLyricsWindowMgr.Content" xml:space="preserve">
<value>Gestor de Janelas de Letras</value> <value>Gestor de Janelas de Letras</value>
</data> </data>
<data name="SettingsPageLyricsWindowSwitchHotKey.Header" xml:space="preserve"> <data name="SettingsPageLyricsWindowSwitchHotKey.Header" xml:space="preserve">
<value>Atalho de Alternância de Estado da Janela</value> <value>Atalho de Alternância de Estado da Janela</value>
</data> </data>
<data name="SettingsPageLyricsWindowToolTip.Content" xml:space="preserve">
<value>Janela de Letras</value>
</data>
<data name="SettingsPageMatchingThreshold.Description" xml:space="preserve"> <data name="SettingsPageMatchingThreshold.Description" xml:space="preserve">
<value>Ajustar este valor afetará os resultados da pesquisa sequencial e de melhor correspondência, mas não afetará os resultados na interface de pesquisa manual de letras</value> <value>Ajustar este valor afetará os resultados da pesquisa sequencial e de melhor correspondência, mas não afetará os resultados na interface de pesquisa manual de letras</value>
</data> </data>
@@ -1248,18 +1176,12 @@
<data name="SettingsPageMusicLib.Header" xml:space="preserve"> <data name="SettingsPageMusicLib.Header" xml:space="preserve">
<value>Biblioteca Multimédia Local</value> <value>Biblioteca Multimédia Local</value>
</data> </data>
<data name="SettingsPageMusicLibRealTimeWatch.Header" xml:space="preserve">
<value>Monitorização de Alterações de Ficheiros em Tempo Real</value>
</data>
<data name="SettingsPageNarrowMode.Text" xml:space="preserve"> <data name="SettingsPageNarrowMode.Text" xml:space="preserve">
<value>Modo Estreito</value> <value>Modo Estreito</value>
</data> </data>
<data name="SettingsPageNextSongHotKey.Header" xml:space="preserve"> <data name="SettingsPageNextSongHotKey.Header" xml:space="preserve">
<value>Atalho para Próxima Faixa</value> <value>Atalho para Próxima Faixa</value>
</data> </data>
<data name="SettingsPageNoBackdrop.Content" xml:space="preserve">
<value>Nenhum</value>
</data>
<data name="SettingsPageOctTree.Content" xml:space="preserve"> <data name="SettingsPageOctTree.Content" xml:space="preserve">
<value>Agressivo</value> <value>Agressivo</value>
</data> </data>
@@ -1287,9 +1209,6 @@
<data name="SettingsPagePathIncludingOthersInfo" xml:space="preserve"> <data name="SettingsPagePathIncludingOthersInfo" xml:space="preserve">
<value>Esta pasta contém pastas já adicionadas, por favor remova essas pastas para adicionar esta</value> <value>Esta pasta contém pastas já adicionadas, por favor remova essas pastas para adicionar esta</value>
</data> </data>
<data name="SettingsPagePathNotFound.Text" xml:space="preserve">
<value>Não foi possível encontrar o caminho no seu computador</value>
</data>
<data name="SettingsPagePatrons.Text" xml:space="preserve"> <data name="SettingsPagePatrons.Text" xml:space="preserve">
<value>Mecenas</value> <value>Mecenas</value>
</data> </data>
@@ -1335,15 +1254,9 @@
<data name="SettingsPageRealtimeStatus.Text" xml:space="preserve"> <data name="SettingsPageRealtimeStatus.Text" xml:space="preserve">
<value>Estado em Tempo Real</value> <value>Estado em Tempo Real</value>
</data> </data>
<data name="SettingsPageRecord.Content" xml:space="preserve">
<value>Gravar</value>
</data>
<data name="SettingsPageRecordedWindowStatus.Text" xml:space="preserve"> <data name="SettingsPageRecordedWindowStatus.Text" xml:space="preserve">
<value>Estado da Janela Gravado</value> <value>Estado da Janela Gravado</value>
</data> </data>
<data name="SettingsPageReference.Header" xml:space="preserve">
<value>Links de Referência</value>
</data>
<data name="SettingsPageRefreshDropdown.Content" xml:space="preserve"> <data name="SettingsPageRefreshDropdown.Content" xml:space="preserve">
<value>Atualizar Menu Suspenso</value> <value>Atualizar Menu Suspenso</value>
</data> </data>
@@ -1362,9 +1275,6 @@
<data name="SettingsPageRight.Content" xml:space="preserve"> <data name="SettingsPageRight.Content" xml:space="preserve">
<value>Direita</value> <value>Direita</value>
</data> </data>
<data name="SettingsPageRomaji.Header" xml:space="preserve">
<value>Fonética Japonesa</value>
</data>
<data name="SettingsPageScope.Header" xml:space="preserve"> <data name="SettingsPageScope.Header" xml:space="preserve">
<value>Âmbito</value> <value>Âmbito</value>
</data> </data>
@@ -1404,6 +1314,9 @@
<data name="SettingsPageSettingsManager.Header" xml:space="preserve"> <data name="SettingsPageSettingsManager.Header" xml:space="preserve">
<value>Gestor de Definições</value> <value>Gestor de Definições</value>
</data> </data>
<data name="SettingsPageSettingsPlayHistory.Header" xml:space="preserve">
<value>História do jogo</value>
</data>
<data name="SettingsPageShareHub.Content" xml:space="preserve"> <data name="SettingsPageShareHub.Content" xml:space="preserve">
<value>Explorar o Centro de Partilha de Recursos Online</value> <value>Explorar o Centro de Partilha de Recursos Online</value>
</data> </data>
@@ -1431,18 +1344,12 @@
<data name="SettingsPageShowInSwitchers.Header" xml:space="preserve"> <data name="SettingsPageShowInSwitchers.Header" xml:space="preserve">
<value>Mostrar no Ambiente do Sistema</value> <value>Mostrar no Ambiente do Sistema</value>
</data> </data>
<data name="SettingsPageShowLayoutDragger.Header" xml:space="preserve">
<value>Mostrar Divisor de Layout</value>
</data>
<data name="SettingsPageShowTitle.Header" xml:space="preserve"> <data name="SettingsPageShowTitle.Header" xml:space="preserve">
<value>Mostrar Título</value> <value>Mostrar Título</value>
</data> </data>
<data name="SettingsPageSlide.Content" xml:space="preserve"> <data name="SettingsPageSlide.Content" xml:space="preserve">
<value>Deslizar</value> <value>Deslizar</value>
</data> </data>
<data name="SettingsPageSliderPrefix.Text" xml:space="preserve">
<value>Valor atual: </value>
</data>
<data name="SettingsPageSnowFlakeLayer.Header" xml:space="preserve"> <data name="SettingsPageSnowFlakeLayer.Header" xml:space="preserve">
<value>Camada de Flocos de Neve</value> <value>Camada de Flocos de Neve</value>
</data> </data>
@@ -1485,6 +1392,9 @@
<data name="SettingsPageStartup.Text" xml:space="preserve"> <data name="SettingsPageStartup.Text" xml:space="preserve">
<value>Arranque</value> <value>Arranque</value>
</data> </data>
<data name="SettingsPageStats.Content" xml:space="preserve">
<value>Estatísticas</value>
</data>
<data name="SettingsPageStopTrackOnGalleryWindowClosed.Header" xml:space="preserve"> <data name="SettingsPageStopTrackOnGalleryWindowClosed.Header" xml:space="preserve">
<value>Parar reprodução ao fechar a janela da galeria de música</value> <value>Parar reprodução ao fechar a janela da galeria de música</value>
</data> </data>
@@ -1503,9 +1413,6 @@
<data name="SettingsPageTaskbarPlacement.Header" xml:space="preserve"> <data name="SettingsPageTaskbarPlacement.Header" xml:space="preserve">
<value>Posição de Fixação na Barra de Tarefas</value> <value>Posição de Fixação na Barra de Tarefas</value>
</data> </data>
<data name="SettingsPageThanksForPurchasing.Text" xml:space="preserve">
<value>Obrigado por adquirir o BetterLyrics</value>
</data>
<data name="SettingsPageThanksList.Header" xml:space="preserve"> <data name="SettingsPageThanksList.Header" xml:space="preserve">
<value>Lista de Agradecimentos</value> <value>Lista de Agradecimentos</value>
</data> </data>
@@ -1524,12 +1431,6 @@
<data name="SettingsPageTitleBarAreaWhole.Content" xml:space="preserve"> <data name="SettingsPageTitleBarAreaWhole.Content" xml:space="preserve">
<value>Janela Inteira</value> <value>Janela Inteira</value>
</data> </data>
<data name="SettingsPageTitleBarType.Header" xml:space="preserve">
<value>Tamanho da Barra de Título</value>
</data>
<data name="SettingsPageToggleHotKey.Header" xml:space="preserve">
<value>Atalho para Entrar e Sair (Cut-in/out)</value>
</data>
<data name="SettingsPageTranslatedText.Header" xml:space="preserve"> <data name="SettingsPageTranslatedText.Header" xml:space="preserve">
<value>Tradução</value> <value>Tradução</value>
</data> </data>
@@ -1539,9 +1440,6 @@
<data name="SettingsPageTranslationConfig.Header" xml:space="preserve"> <data name="SettingsPageTranslationConfig.Header" xml:space="preserve">
<value>Serviço de Tradução LibreTranslate</value> <value>Serviço de Tradução LibreTranslate</value>
</data> </data>
<data name="SettingsPageTranslationInfoLink.Text" xml:space="preserve">
<value>Visite https://github.com/LibreTranslate/LibreTranslate para tutoriais de instalação e mais informações (este software não tem afiliação com o serviço de tradução)</value>
</data>
<data name="SettingsPageUserWhoPurchased.Text" xml:space="preserve"> <data name="SettingsPageUserWhoPurchased.Text" xml:space="preserve">
<value>e os utilizadores que compraram e apoiaram o BetterLyrics</value> <value>e os utilizadores que compraram e apoiaram o BetterLyrics</value>
</data> </data>
@@ -1554,9 +1452,6 @@
<data name="SettingsPageWidth.Header" xml:space="preserve"> <data name="SettingsPageWidth.Header" xml:space="preserve">
<value>Largura</value> <value>Largura</value>
</data> </data>
<data name="SettingsPageWindowBounds.Header" xml:space="preserve">
<value>Limites da Janela</value>
</data>
<data name="SettingsPageWorkArea.Description" xml:space="preserve"> <data name="SettingsPageWorkArea.Description" xml:space="preserve">
<value>Como uma área de trabalho separada, acoplada na margem superior/inferior do ecrã</value> <value>Como uma área de trabalho separada, acoplada na margem superior/inferior do ecrã</value>
</data> </data>
@@ -1572,6 +1467,39 @@
<data name="StandardMode" xml:space="preserve"> <data name="StandardMode" xml:space="preserve">
<value>Modo Padrão</value> <value>Modo Padrão</value>
</data> </data>
<data name="StatsDashboardControlSources.Text" xml:space="preserve">
<value>Fontes</value>
</data>
<data name="StatsDashboardControlThisMonth.Header" xml:space="preserve">
<value>Este mês</value>
</data>
<data name="StatsDashboardControlThisQuarter.Header" xml:space="preserve">
<value>Este trimestre</value>
</data>
<data name="StatsDashboardControlThisWeek.Header" xml:space="preserve">
<value>Esta semana</value>
</data>
<data name="StatsDashboardControlThisYear.Header" xml:space="preserve">
<value>Este ano</value>
</data>
<data name="StatsDashboardControlToday.Header" xml:space="preserve">
<value>Hoje</value>
</data>
<data name="StatsDashboardControlTopArtists.Text" xml:space="preserve">
<value>Artistas de topo</value>
</data>
<data name="StatsDashboardControlTopSongs.Text" xml:space="preserve">
<value>Faixas superiores</value>
</data>
<data name="StatsDashboardControlTopSource.Text" xml:space="preserve">
<value>Fonte superior</value>
</data>
<data name="StatsDashboardControlTotalDuration.Text" xml:space="preserve">
<value>Duração total</value>
</data>
<data name="StatsDashboardControlTracksPlayed.Text" xml:space="preserve">
<value>Faixas reproduzidas</value>
</data>
<data name="SystemTrayExit.Text" xml:space="preserve"> <data name="SystemTrayExit.Text" xml:space="preserve">
<value>Sair do Programa</value> <value>Sair do Programa</value>
</data> </data>
@@ -1581,9 +1509,6 @@
<data name="SystemTrayMusicGallery.Text" xml:space="preserve"> <data name="SystemTrayMusicGallery.Text" xml:space="preserve">
<value>Abrir Galeria de Música</value> <value>Abrir Galeria de Música</value>
</data> </data>
<data name="SystemTrayPageTitle" xml:space="preserve">
<value>Tabuleiro do Sistema - BetterLyrics</value>
</data>
<data name="SystemTrayResetWindowPosition.Text" xml:space="preserve"> <data name="SystemTrayResetWindowPosition.Text" xml:space="preserve">
<value>Repor Posição da Janela</value> <value>Repor Posição da Janela</value>
</data> </data>

View File

@@ -129,21 +129,12 @@
<data name="AlbumArtSearchSMTCProvider" xml:space="preserve"> <data name="AlbumArtSearchSMTCProvider" xml:space="preserve">
<value>Музыкальный плеер</value> <value>Музыкальный плеер</value>
</data> </data>
<data name="AllLyricsSettingsControlPictureInPicture.Content" xml:space="preserve">
<value>Режим «Картинка в картинке»</value>
</data>
<data name="AppSettingsControlGeneral.Text" xml:space="preserve"> <data name="AppSettingsControlGeneral.Text" xml:space="preserve">
<value>Окно</value> <value>Окно</value>
</data> </data>
<data name="ArtistsSplitHint.Text" xml:space="preserve"> <data name="ArtistsSplitHint.Text" xml:space="preserve">
<value>При вводе нескольких исполнителей разделяйте их одним из следующих разделителей (не смешивайте их)</value> <value>При вводе нескольких исполнителей разделяйте их одним из следующих разделителей (не смешивайте их)</value>
</data> </data>
<data name="BaseWindowHostInfoBarCheckBox.Content" xml:space="preserve">
<value>Больше не показывать это сообщение</value>
</data>
<data name="BaseWindowMiniFlyoutItem.Text" xml:space="preserve">
<value>Режим «Картинка в картинке»</value>
</data>
<data name="Cancel" xml:space="preserve"> <data name="Cancel" xml:space="preserve">
<value>Отмена</value> <value>Отмена</value>
</data> </data>
@@ -168,24 +159,45 @@
<data name="DockedMode" xml:space="preserve"> <data name="DockedMode" xml:space="preserve">
<value>Закрепленный режим</value> <value>Закрепленный режим</value>
</data> </data>
<data name="Error" xml:space="preserve">
<value>Ошибка</value>
</data>
<data name="ExportSettingsSuccess" xml:space="preserve"> <data name="ExportSettingsSuccess" xml:space="preserve">
<value>Экспорт выполнен успешно</value> <value>Экспорт выполнен успешно</value>
</data> </data>
<data name="FailToStartLXMusicServer" xml:space="preserve"> <data name="FailToStartLXMusicServer" xml:space="preserve">
<value>Не удалось подключиться к серверу LX Music. Перейдите в Настройки - Источник воспроизведения - LX Music - Сервер LX Music, чтобы проверить правильность ссылки</value> <value>Не удалось подключиться к серверу LX Music. Перейдите в Настройки - Источник воспроизведения - LX Music - Сервер LX Music, чтобы проверить правильность ссылки</value>
</data> </data>
<data name="FileSystemServiceCleaningCache" xml:space="preserve">
<value>Очистка кэша...</value>
</data>
<data name="FileSystemServiceConnectFailed" xml:space="preserve">
<value>Сбой подключения</value>
</data>
<data name="FileSystemServiceConnecting" xml:space="preserve">
<value>Подключение...</value>
</data>
<data name="FileSystemServiceFetchingFileList" xml:space="preserve">
<value>Загрузка списка файлов...</value>
</data>
<data name="FileSystemServiceParsing" xml:space="preserve">
<value>Парсинг...</value>
</data>
<data name="FileSystemServicePrepareToClean" xml:space="preserve">
<value>Подготовка к очистке кэша...</value>
</data>
<data name="FileSystemServiceReady" xml:space="preserve">
<value>Готовые</value>
</data>
<data name="FileSystemServiceRootDirectoryWarning" xml:space="preserve">
<value>Обнаружен путь к корневому каталогу. Полный индекс диска может содержать большое количество файлов, не относящихся к мультимедиа, что приведет к слишком долгому сканированию. Рекомендуется указывать конкретный подкаталог.</value>
</data>
<data name="FileSystemServiceWaitingForScan" xml:space="preserve">
<value>Ожидание сканирования...</value>
</data>
<data name="FullscreenMode" xml:space="preserve"> <data name="FullscreenMode" xml:space="preserve">
<value>Полноэкранный режим</value> <value>Полноэкранный режим</value>
</data> </data>
<data name="HostWindowClickThroughButton.Content" xml:space="preserve">
<value>Блокировка</value>
</data>
<data name="HostWindowClickThroughFlyoutItem.Text" xml:space="preserve">
<value>Блокировка</value>
</data>
<data name="HostWindowLockToolTip.Text" xml:space="preserve">
<value>Блокировка</value>
</data>
<data name="HostWindowMusicGalleryButtonToolTip.Content" xml:space="preserve"> <data name="HostWindowMusicGalleryButtonToolTip.Content" xml:space="preserve">
<value>Музыкальная галерея</value> <value>Музыкальная галерея</value>
</data> </data>
@@ -204,9 +216,6 @@
<data name="Jyutping" xml:space="preserve"> <data name="Jyutping" xml:space="preserve">
<value>Ютпхин (Кантонский)</value> <value>Ютпхин (Кантонский)</value>
</data> </data>
<data name="KeepAtLeastOneStatusDefault" xml:space="preserve">
<value>Пожалуйста, убедитесь, что хотя бы один статус установлен по умолчанию</value>
</data>
<data name="LastFMAuthFailed" xml:space="preserve"> <data name="LastFMAuthFailed" xml:space="preserve">
<value>Ошибка авторизации, попробуйте снова</value> <value>Ошибка авторизации, попробуйте снова</value>
</data> </data>
@@ -270,18 +279,12 @@
<data name="LyricsPageSettings.Text" xml:space="preserve"> <data name="LyricsPageSettings.Text" xml:space="preserve">
<value>Настройки</value> <value>Настройки</value>
</data> </data>
<data name="LyricsPageTimelineOffsetButtonToolTip.Content" xml:space="preserve">
<value>Смещение таймлайна текста</value>
</data>
<data name="LyricsPageTranslationEnabled.Description" xml:space="preserve"> <data name="LyricsPageTranslationEnabled.Description" xml:space="preserve">
<value>Приоритет отдается переводу внутри текста песни; если совпадений нет, запрашивается машинный перевод у сервера LibreTranslate</value> <value>Приоритет отдается переводу внутри текста песни; если совпадений нет, запрашивается машинный перевод у сервера LibreTranslate</value>
</data> </data>
<data name="LyricsPageTranslationEnabled.Header" xml:space="preserve"> <data name="LyricsPageTranslationEnabled.Header" xml:space="preserve">
<value>Включить перевод</value> <value>Включить перевод</value>
</data> </data>
<data name="LyricsPageTranslationOnly.Header" xml:space="preserve">
<value>Показывать только перевод</value>
</data>
<data name="LyricsPageTranslationProviderPrefix.Header" xml:space="preserve"> <data name="LyricsPageTranslationProviderPrefix.Header" xml:space="preserve">
<value>Поставщик перевода</value> <value>Поставщик перевода</value>
</data> </data>
@@ -330,9 +333,6 @@
<data name="LyricsSearchControlSongInfoMapping.Text" xml:space="preserve"> <data name="LyricsSearchControlSongInfoMapping.Text" xml:space="preserve">
<value>Сопоставление информации о песне</value> <value>Сопоставление информации о песне</value>
</data> </data>
<data name="LyricsSearchControlTargetSearchProvider.Header" xml:space="preserve">
<value>Целевой поставщик поиска текста</value>
</data>
<data name="LyricsSearchControlTitle.Header" xml:space="preserve"> <data name="LyricsSearchControlTitle.Header" xml:space="preserve">
<value>Название</value> <value>Название</value>
</data> </data>
@@ -351,15 +351,9 @@
<data name="LyricsSearchProviderTtmlFile" xml:space="preserve"> <data name="LyricsSearchProviderTtmlFile" xml:space="preserve">
<value>Локальный файл .TTML</value> <value>Локальный файл .TTML</value>
</data> </data>
<data name="LyricsWindowImmersiveButtonToolTip.Content" xml:space="preserve">
<value>Иммерсивный режим</value>
</data>
<data name="LyricsWindowSettingsControlLyricsWindowConfig.Text" xml:space="preserve"> <data name="LyricsWindowSettingsControlLyricsWindowConfig.Text" xml:space="preserve">
<value>Конфигурация</value> <value>Конфигурация</value>
</data> </data>
<data name="LyricsWindowSettingsControlLyricsWindowMode.Header" xml:space="preserve">
<value>Режим окна текста</value>
</data>
<data name="LyricsWindowSettingsControlSetDefault.Text" xml:space="preserve"> <data name="LyricsWindowSettingsControlSetDefault.Text" xml:space="preserve">
<value>Установить по умолчанию</value> <value>Установить по умолчанию</value>
</data> </data>
@@ -378,9 +372,6 @@
<data name="MainPageAlbumArtOnly.Content" xml:space="preserve"> <data name="MainPageAlbumArtOnly.Content" xml:space="preserve">
<value>Показывать только обложку альбома</value> <value>Показывать только обложку альбома</value>
</data> </data>
<data name="MainPageEnterImmersiveModeHint" xml:space="preserve">
<value>Наведите курсор снова, чтобы показать кнопку переключения</value>
</data>
<data name="MainPageLyriscOnly.Content" xml:space="preserve"> <data name="MainPageLyriscOnly.Content" xml:space="preserve">
<value>Показывать только текст</value> <value>Показывать только текст</value>
</data> </data>
@@ -396,6 +387,18 @@
<data name="MainPageSplitView.Content" xml:space="preserve"> <data name="MainPageSplitView.Content" xml:space="preserve">
<value>Разделенный вид</value> <value>Разделенный вид</value>
</data> </data>
<data name="MediaSettingsControlLastSyncTime.Header" xml:space="preserve">
<value>Время последней синхронизации</value>
</data>
<data name="MediaSettingsControlLocalFolder" xml:space="preserve">
<value>Локальная папка</value>
</data>
<data name="MediaSettingsControlNameSetting.Header" xml:space="preserve">
<value>Имя</value>
</data>
<data name="MediaSettingsControlSyncNow.Content" xml:space="preserve">
<value>Синхронизировать</value>
</data>
<data name="MusicGalleryPageAddToCustomList.Text" xml:space="preserve"> <data name="MusicGalleryPageAddToCustomList.Text" xml:space="preserve">
<value>Добавить в плейлист</value> <value>Добавить в плейлист</value>
</data> </data>
@@ -406,11 +409,17 @@
<value>Следующим пунктом</value> <value>Следующим пунктом</value>
</data> </data>
<data name="MusicGalleryPageAddToPlayingQueue.Text" xml:space="preserve"> <data name="MusicGalleryPageAddToPlayingQueue.Text" xml:space="preserve">
<value>Добавить в очередь</value> <value>Добавить в очередь на воспроизведение</value>
</data> </data>
<data name="MusicGalleryPageAllSongs" xml:space="preserve"> <data name="MusicGalleryPageAllSongs" xml:space="preserve">
<value>Вся музыка</value> <value>Вся музыка</value>
</data> </data>
<data name="MusicGalleryPageDataSync.Message" xml:space="preserve">
<value>Выполняется синхронизация медиатеки...</value>
</data>
<data name="MusicGalleryPageDataSyncError.Message" xml:space="preserve">
<value>Возникла проблема с синхронизацией медиатеки</value>
</data>
<data name="MusicGalleryPageEmptyPlayingQueue.Text" xml:space="preserve"> <data name="MusicGalleryPageEmptyPlayingQueue.Text" xml:space="preserve">
<value>Очистить очередь воспроизведения</value> <value>Очистить очередь воспроизведения</value>
</data> </data>
@@ -420,9 +429,6 @@
<data name="MusicGalleryPageFileArtist.Header" xml:space="preserve"> <data name="MusicGalleryPageFileArtist.Header" xml:space="preserve">
<value>Исполнитель</value> <value>Исполнитель</value>
</data> </data>
<data name="MusicGalleryPageFileInfo.Text" xml:space="preserve">
<value>Информация о файле</value>
</data>
<data name="MusicGalleryPageFileInfoBitDepth.Header" xml:space="preserve"> <data name="MusicGalleryPageFileInfoBitDepth.Header" xml:space="preserve">
<value>Битовая глубина</value> <value>Битовая глубина</value>
</data> </data>
@@ -456,14 +462,14 @@
<data name="MusicGalleryPageFileNotFound.Text" xml:space="preserve"> <data name="MusicGalleryPageFileNotFound.Text" xml:space="preserve">
<value>Песни в медиатеке не найдены</value> <value>Песни в медиатеке не найдены</value>
</data> </data>
<data name="MusicGalleryPageFolder.Text" xml:space="preserve">
<value>Папки</value>
</data>
<data name="MusicGalleryPageImportFromFile.Text" xml:space="preserve"> <data name="MusicGalleryPageImportFromFile.Text" xml:space="preserve">
<value>Импорт из файла</value> <value>Импорт из файла</value>
</data> </data>
<data name="MusicGalleryPageNewPlaylist.Text" xml:space="preserve"> <data name="MusicGalleryPageNewPlaylist.Text" xml:space="preserve">
<value>Создать плейлист</value> <value>Создайте плейлист</value>
</data>
<data name="MusicGalleryPagePlayAll.Content" xml:space="preserve">
<value>Воспроизвести все</value>
</data> </data>
<data name="MusicGalleryPagePlayingQueue.Text" xml:space="preserve"> <data name="MusicGalleryPagePlayingQueue.Text" xml:space="preserve">
<value>Очередь воспроизведения</value> <value>Очередь воспроизведения</value>
@@ -472,7 +478,7 @@
<value>Очередь воспроизведения пуста</value> <value>Очередь воспроизведения пуста</value>
</data> </data>
<data name="MusicGalleryPagePlaylist.Text" xml:space="preserve"> <data name="MusicGalleryPagePlaylist.Text" xml:space="preserve">
<value>Плейлист</value> <value>Плейлисты</value>
</data> </data>
<data name="MusicGalleryPageQueueLoop.Text" xml:space="preserve"> <data name="MusicGalleryPageQueueLoop.Text" xml:space="preserve">
<value>Зациклить список</value> <value>Зациклить список</value>
@@ -489,9 +495,6 @@
<data name="MusicGalleryPageScrollToPlayingItem.Text" xml:space="preserve"> <data name="MusicGalleryPageScrollToPlayingItem.Text" xml:space="preserve">
<value>Прокрутить к текущей песне</value> <value>Прокрутить к текущей песне</value>
</data> </data>
<data name="MusicGalleryPageSelectAll.Content" xml:space="preserve">
<value>Выбрать все</value>
</data>
<data name="MusicGalleryPageSingleLoop.Text" xml:space="preserve"> <data name="MusicGalleryPageSingleLoop.Text" xml:space="preserve">
<value>Зациклить одну</value> <value>Зациклить одну</value>
</data> </data>
@@ -513,20 +516,29 @@
<data name="MusicGalleryPageSortType.Text" xml:space="preserve"> <data name="MusicGalleryPageSortType.Text" xml:space="preserve">
<value>Тип сортировки</value> <value>Тип сортировки</value>
</data> </data>
<data name="MusicGalleryPageStarredPlaylist.Content" xml:space="preserve">
<value>Избранный плейлист</value>
</data>
<data name="MusicGalleryPageStopTrack.Text" xml:space="preserve"> <data name="MusicGalleryPageStopTrack.Text" xml:space="preserve">
<value>Стоп</value> <value>Стоп</value>
</data> </data>
<data name="MusicGalleryPageTitle" xml:space="preserve"> <data name="MusicGalleryPageTitle" xml:space="preserve">
<value>Музыкальная галерея - BetterLyrics</value> <value>Музыкальная галерея - BetterLyrics</value>
</data> </data>
<data name="MusicGalleryWindowDownButtonToolTip.Content" xml:space="preserve"> <data name="MusicSettingsControlAutoSyncInterval.Header" xml:space="preserve">
<value>Свернуть</value> <value>Частота автосинхронизации</value>
</data> </data>
<data name="MusicGalleryWindowUpButtonToolTip.Content" xml:space="preserve"> <data name="MusicSettingsControlAutoSyncIntervalDisabled.Content" xml:space="preserve">
<value>Развернуть</value> <value>Никогда</value>
</data>
<data name="MusicSettingsControlAutoSyncIntervalEveryDay.Content" xml:space="preserve">
<value>Каждый день</value>
</data>
<data name="MusicSettingsControlAutoSyncIntervalEveryFifteenMin.Content" xml:space="preserve">
<value>Каждые 15 минут</value>
</data>
<data name="MusicSettingsControlAutoSyncIntervalEveryHour.Content" xml:space="preserve">
<value>Каждый час</value>
</data>
<data name="MusicSettingsControlAutoSyncIntervalEverySixHrs.Content" xml:space="preserve">
<value>Каждые 6 часов</value>
</data> </data>
<data name="NarrowMode" xml:space="preserve"> <data name="NarrowMode" xml:space="preserve">
<value>Узкий режим</value> <value>Узкий режим</value>
@@ -543,12 +555,27 @@
<data name="PrivacyPolicy.Content" xml:space="preserve"> <data name="PrivacyPolicy.Content" xml:space="preserve">
<value>Политика конфиденциальности</value> <value>Политика конфиденциальности</value>
</data> </data>
<data name="RemoteServerConfigControlBrowse.Content" xml:space="preserve">
<value>Просмотреть</value>
</data>
<data name="RemoteServerConfigControlName.Header" xml:space="preserve">
<value>Имя</value>
</data>
<data name="RemoteServerConfigControlName.PlaceholderText" xml:space="preserve">
<value>Если оставить этот параметр пустым, имя по умолчанию будет сгенерировано автоматически.</value>
</data>
<data name="RemoteServerConfigControlPassword.Header" xml:space="preserve"> <data name="RemoteServerConfigControlPassword.Header" xml:space="preserve">
<value>Пароль</value> <value>Пароль</value>
</data> </data>
<data name="RemoteServerConfigControlPath.Header" xml:space="preserve"> <data name="RemoteServerConfigControlPath.Header" xml:space="preserve">
<value>Путь</value> <value>Путь</value>
</data> </data>
<data name="RemoteServerConfigControlPathNotExisted" xml:space="preserve">
<value>Указанный путь к папке не найден</value>
</data>
<data name="RemoteServerConfigControlPathRequired" xml:space="preserve">
<value>Путь обязателен</value>
</data>
<data name="RemoteServerConfigControlPort.Header" xml:space="preserve"> <data name="RemoteServerConfigControlPort.Header" xml:space="preserve">
<value>Порт</value> <value>Порт</value>
</data> </data>
@@ -576,9 +603,6 @@
<data name="SetingsPageFeedback.Text" xml:space="preserve"> <data name="SetingsPageFeedback.Text" xml:space="preserve">
<value>Обратная связь</value> <value>Обратная связь</value>
</data> </data>
<data name="SetingsPageInstructions.Text" xml:space="preserve">
<value>Инструкции</value>
</data>
<data name="SetingsPageSpecialThanks.Text" xml:space="preserve"> <data name="SetingsPageSpecialThanks.Text" xml:space="preserve">
<value>Особая благодарность</value> <value>Особая благодарность</value>
</data> </data>
@@ -606,9 +630,6 @@
<data name="SettingsPageAddFolderButton.Content" xml:space="preserve"> <data name="SettingsPageAddFolderButton.Content" xml:space="preserve">
<value>Добавить</value> <value>Добавить</value>
</data> </data>
<data name="SettingsPageAdvanced.Text" xml:space="preserve">
<value>Расширенные настройки</value>
</data>
<data name="SettingsPageAlbum.Header" xml:space="preserve"> <data name="SettingsPageAlbum.Header" xml:space="preserve">
<value>Альбом</value> <value>Альбом</value>
</data> </data>
@@ -624,15 +645,9 @@
<data name="SettingsPageAlbumArtSearchProvidersConfig.Text" xml:space="preserve"> <data name="SettingsPageAlbumArtSearchProvidersConfig.Text" xml:space="preserve">
<value>Настроить источники обложек</value> <value>Настроить источники обложек</value>
</data> </data>
<data name="SettingsPageAlbumArtSize.Header" xml:space="preserve">
<value>Размер обложки</value>
</data>
<data name="SettingsPageAlbumEffect.Text" xml:space="preserve"> <data name="SettingsPageAlbumEffect.Text" xml:space="preserve">
<value>Эффект обложки</value> <value>Эффект обложки</value>
</data> </data>
<data name="SettingsPageAlbumLib.Content" xml:space="preserve">
<value>Источники обложек</value>
</data>
<data name="SettingsPageAlbumRadius.Header" xml:space="preserve"> <data name="SettingsPageAlbumRadius.Header" xml:space="preserve">
<value>Радиус скругления</value> <value>Радиус скругления</value>
</data> </data>
@@ -663,12 +678,6 @@
<data name="SettingsPageAppAppearance.Text" xml:space="preserve"> <data name="SettingsPageAppAppearance.Text" xml:space="preserve">
<value>Внешний вид</value> <value>Внешний вид</value>
</data> </data>
<data name="SettingsPageAppBehavior.Text" xml:space="preserve">
<value>Общее поведение</value>
</data>
<data name="SettingsPageApply.Content" xml:space="preserve">
<value>Применить</value>
</data>
<data name="SettingsPageArtist.Header" xml:space="preserve"> <data name="SettingsPageArtist.Header" xml:space="preserve">
<value>Исполнитель</value> <value>Исполнитель</value>
</data> </data>
@@ -687,23 +696,14 @@
<data name="SettingsPageAutoStart.Header" xml:space="preserve"> <data name="SettingsPageAutoStart.Header" xml:space="preserve">
<value>Автозагрузка</value> <value>Автозагрузка</value>
</data> </data>
<data name="SettingsPageAutoStartWindow.Header" xml:space="preserve">
<value>При запуске приложения</value>
</data>
<data name="SettingsPageBackdrop.Header" xml:space="preserve">
<value>Материал фона текста</value>
</data>
<data name="SettingsPageBackgroundOverlay.Text" xml:space="preserve"> <data name="SettingsPageBackgroundOverlay.Text" xml:space="preserve">
<value>Фон текста</value> <value>Фон текста</value>
</data> </data>
<data name="SettingsPageBlurAmount.Header" xml:space="preserve"> <data name="SettingsPageBlurAmount.Header" xml:space="preserve">
<value>Степень размытия</value> <value>Степень размытия</value>
</data> </data>
<data name="SettingsPageBorderless.Header" xml:space="preserve">
<value>Окно без полей</value>
</data>
<data name="SettingsPageCache.Description" xml:space="preserve"> <data name="SettingsPageCache.Description" xml:space="preserve">
<value>Включает лог-файлы, кэш онлайн-текстов</value> <value>Включая файлы журналов, кэш онлайновых текстов песен</value>
</data> </data>
<data name="SettingsPageCache.Header" xml:space="preserve"> <data name="SettingsPageCache.Header" xml:space="preserve">
<value>Кэш</value> <value>Кэш</value>
@@ -738,9 +738,6 @@
<data name="SettingsPageCollapseDropdown.Content" xml:space="preserve"> <data name="SettingsPageCollapseDropdown.Content" xml:space="preserve">
<value>Свернуть выпадающий список</value> <value>Свернуть выпадающий список</value>
</data> </data>
<data name="SettingsPageCompactTitleBar.Content" xml:space="preserve">
<value>Компактный</value>
</data>
<data name="SettingsPageConfigName.Description" xml:space="preserve"> <data name="SettingsPageConfigName.Description" xml:space="preserve">
<value>Названия записанных состояний окон помогут вам лучше их различать</value> <value>Названия записанных состояний окон помогут вам лучше их различать</value>
</data> </data>
@@ -759,18 +756,12 @@
<data name="SettingsPageCrossfade.Content" xml:space="preserve"> <data name="SettingsPageCrossfade.Content" xml:space="preserve">
<value>Кроссфейд</value> <value>Кроссфейд</value>
</data> </data>
<data name="SettingsPageCurrentLyricsWindowStatus.Text" xml:space="preserve">
<value>Текущее состояние окна текста</value>
</data>
<data name="SettingsPageCutletDockerServer.Header" xml:space="preserve"> <data name="SettingsPageCutletDockerServer.Header" xml:space="preserve">
<value>Сервис транслитерации cutlet-docker</value> <value>Сервис транслитерации cutlet-docker</value>
</data> </data>
<data name="SettingsPageDark.Content" xml:space="preserve"> <data name="SettingsPageDark.Content" xml:space="preserve">
<value>Тёмная</value> <value>Тёмная</value>
</data> </data>
<data name="SettingsPageDebugOverlay.Header" xml:space="preserve">
<value>Показать оверлей отладки</value>
</data>
<data name="SettingsPageDelete.Text" xml:space="preserve"> <data name="SettingsPageDelete.Text" xml:space="preserve">
<value>Удалить</value> <value>Удалить</value>
</data> </data>
@@ -801,15 +792,9 @@
<data name="SettingsPageDockPlacementTop.Content" xml:space="preserve"> <data name="SettingsPageDockPlacementTop.Content" xml:space="preserve">
<value>Сверху</value> <value>Сверху</value>
</data> </data>
<data name="SettingsPageDockWindowHeight.Header" xml:space="preserve">
<value>Высота окна</value>
</data>
<data name="SettingsPageDragArea.Header" xml:space="preserve"> <data name="SettingsPageDragArea.Header" xml:space="preserve">
<value>Перетаскиваемая область</value> <value>Перетаскиваемая область</value>
</data> </data>
<data name="SettingsPageEasingFuncType.Header" xml:space="preserve">
<value>Тип функции плавности</value>
</data>
<data name="SettingsPageEasingTypeEaseInOutBack.Content" xml:space="preserve"> <data name="SettingsPageEasingTypeEaseInOutBack.Content" xml:space="preserve">
<value>Back Ease In-Out</value> <value>Back Ease In-Out</value>
</data> </data>
@@ -873,18 +858,15 @@
<data name="SettingsPageExitOnLyricsWindowClosed.Header" xml:space="preserve"> <data name="SettingsPageExitOnLyricsWindowClosed.Header" xml:space="preserve">
<value>Выходить из программы при закрытии окна текста</value> <value>Выходить из программы при закрытии окна текста</value>
</data> </data>
<data name="SettingsPageExportPlayHistoryButton.Content" xml:space="preserve">
<value>Экспорт истории игр</value>
</data>
<data name="SettingsPageExportSettingsButton.Content" xml:space="preserve"> <data name="SettingsPageExportSettingsButton.Content" xml:space="preserve">
<value>Экспорт настроек</value> <value>Экспорт настроек</value>
</data> </data>
<data name="SettingsPageExtendedTitleBar.Content" xml:space="preserve">
<value>Расширенный</value>
</data>
<data name="SettingsPageFan.Header" xml:space="preserve"> <data name="SettingsPageFan.Header" xml:space="preserve">
<value>Веерный текст</value> <value>Веерный текст</value>
</data> </data>
<data name="SettingsPageFAQ.Content" xml:space="preserve">
<value>Часто задаваемые вопросы (FAQ)</value>
</data>
<data name="SettingsPageFixedTimeStep.Header" xml:space="preserve"> <data name="SettingsPageFixedTimeStep.Header" xml:space="preserve">
<value>Рендеринг с фиксированным шагом времени</value> <value>Рендеринг с фиксированным шагом времени</value>
</data> </data>
@@ -921,9 +903,6 @@
<data name="SettingsPageHeight.Header" xml:space="preserve"> <data name="SettingsPageHeight.Header" xml:space="preserve">
<value>Высота</value> <value>Высота</value>
</data> </data>
<data name="SettingsPageHello.Text" xml:space="preserve">
<value>Привет</value>
</data>
<data name="SettingsPageHelpUsTranslate.Content" xml:space="preserve"> <data name="SettingsPageHelpUsTranslate.Content" xml:space="preserve">
<value>Помогите нам перевести это приложение</value> <value>Помогите нам перевести это приложение</value>
</data> </data>
@@ -954,9 +933,6 @@
<data name="SettingsPageJapanese.Header" xml:space="preserve"> <data name="SettingsPageJapanese.Header" xml:space="preserve">
<value>Японская фонетика</value> <value>Японская фонетика</value>
</data> </data>
<data name="SettingsPageJoinNowButton.Content" xml:space="preserve">
<value>Присоединиться сейчас</value>
</data>
<data name="SettingsPageJyutping.Content" xml:space="preserve"> <data name="SettingsPageJyutping.Content" xml:space="preserve">
<value>Ютпхин</value> <value>Ютпхин</value>
</data> </data>
@@ -1005,18 +981,12 @@
<data name="SettingsPageLight.Content" xml:space="preserve"> <data name="SettingsPageLight.Content" xml:space="preserve">
<value>Светлая</value> <value>Светлая</value>
</data> </data>
<data name="SettingsPageLinkedFile.Text" xml:space="preserve">
<value>Связанный локальный файл</value>
</data>
<data name="SettingsPageListenNewSession.Header" xml:space="preserve"> <data name="SettingsPageListenNewSession.Header" xml:space="preserve">
<value>Включить прослушивание новых источников воспроизведения</value> <value>Включить прослушивание новых источников воспроизведения</value>
</data> </data>
<data name="SettingsPageLocalFolder.Text" xml:space="preserve"> <data name="SettingsPageLocalFolder.Text" xml:space="preserve">
<value>Локальная папка</value> <value>Локальная папка</value>
</data> </data>
<data name="SettingsPageLog.Header" xml:space="preserve">
<value>Логирование</value>
</data>
<data name="SettingsPageLongSyllableDuration.Header" xml:space="preserve"> <data name="SettingsPageLongSyllableDuration.Header" xml:space="preserve">
<value>Порог длинного слога</value> <value>Порог длинного слога</value>
</data> </data>
@@ -1071,15 +1041,6 @@
<data name="SettingsPageLyricsFgFontColor.Header" xml:space="preserve"> <data name="SettingsPageLyricsFgFontColor.Header" xml:space="preserve">
<value>Текущая строка</value> <value>Текущая строка</value>
</data> </data>
<data name="SettingsPageLyricsFgFontColorAdaptiveColored.Content" xml:space="preserve">
<value>Адаптивный к фону (Цветной)</value>
</data>
<data name="SettingsPageLyricsFgFontColorAdaptiveGrayed.Content" xml:space="preserve">
<value>Адаптивный к фону (Серый)</value>
</data>
<data name="SettingsPageLyricsFgFontColorCustom.Content" xml:space="preserve">
<value>Пользовательский</value>
</data>
<data name="SettingsPageLyricsFloatAnimation.Header" xml:space="preserve"> <data name="SettingsPageLyricsFloatAnimation.Header" xml:space="preserve">
<value>Анимация плавания</value> <value>Анимация плавания</value>
</data> </data>
@@ -1107,27 +1068,12 @@
<data name="SettingsPageLyricsGlowEffect.Header" xml:space="preserve"> <data name="SettingsPageLyricsGlowEffect.Header" xml:space="preserve">
<value>Эффект свечения</value> <value>Эффект свечения</value>
</data> </data>
<data name="SettingsPageLyricsHighlight.Header" xml:space="preserve">
<value>Подсветка</value>
</data>
<data name="SettingsPageLyricsHighlightScope.Header" xml:space="preserve">
<value>Область подсветки оригинала</value>
</data>
<data name="SettingsPageLyricsLeft.Content" xml:space="preserve">
<value>Слева</value>
</data>
<data name="SettingsPageLyricsLight.Content" xml:space="preserve"> <data name="SettingsPageLyricsLight.Content" xml:space="preserve">
<value>Тонкий (Light)</value> <value>Тонкий (Light)</value>
</data> </data>
<data name="SettingsPageLyricsLineFade.Header" xml:space="preserve">
<value>Затухание краев области воспроизведения</value>
</data>
<data name="SettingsPageLyricsLineSpacingFactor.Header" xml:space="preserve"> <data name="SettingsPageLyricsLineSpacingFactor.Header" xml:space="preserve">
<value>Межстрочный интервал</value> <value>Межстрочный интервал</value>
</data> </data>
<data name="SettingsPageLyricsLineSpacingFactorUnit.Text" xml:space="preserve">
<value> x Высота строки</value>
</data>
<data name="SettingsPageLyricsMedium.Content" xml:space="preserve"> <data name="SettingsPageLyricsMedium.Content" xml:space="preserve">
<value>Средний</value> <value>Средний</value>
</data> </data>
@@ -1170,9 +1116,6 @@
<data name="SettingsPageLyricsSemiLight.Content" xml:space="preserve"> <data name="SettingsPageLyricsSemiLight.Content" xml:space="preserve">
<value>Полутонкий</value> <value>Полутонкий</value>
</data> </data>
<data name="SettingsPageLyricsShadow.Header" xml:space="preserve">
<value>Тень</value>
</data>
<data name="SettingsPageLyricsStyle.Text" xml:space="preserve"> <data name="SettingsPageLyricsStyle.Text" xml:space="preserve">
<value>Стиль текста</value> <value>Стиль текста</value>
</data> </data>
@@ -1188,30 +1131,15 @@
<data name="SettingsPageLyricsTimelineThreshold.Header" xml:space="preserve"> <data name="SettingsPageLyricsTimelineThreshold.Header" xml:space="preserve">
<value>Порог синхронизации таймлайна</value> <value>Порог синхронизации таймлайна</value>
</data> </data>
<data name="SettingsPageLyricsTranslationHighlight.Header" xml:space="preserve">
<value>Подсветка перевода</value>
</data>
<data name="SettingsPageLyricsTranslationSeparator.Header" xml:space="preserve">
<value>Разделитель оригинала и перевода</value>
</data>
<data name="SettingsPageLyricsVerticalEdgeOpacity.Header" xml:space="preserve">
<value>Непрозрачность верхнего/нижнего края</value>
</data>
<data name="SettingsPageLyricsWindow.Text" xml:space="preserve"> <data name="SettingsPageLyricsWindow.Text" xml:space="preserve">
<value>Окно текста</value> <value>Окно текста</value>
</data> </data>
<data name="SettingsPageLyricsWindowManager.Text" xml:space="preserve">
<value>Менеджер окон текста</value>
</data>
<data name="SettingsPageLyricsWindowMgr.Content" xml:space="preserve"> <data name="SettingsPageLyricsWindowMgr.Content" xml:space="preserve">
<value>Менеджер окон текста</value> <value>Менеджер окон текста</value>
</data> </data>
<data name="SettingsPageLyricsWindowSwitchHotKey.Header" xml:space="preserve"> <data name="SettingsPageLyricsWindowSwitchHotKey.Header" xml:space="preserve">
<value>Горячая клавиша переключения состояния окна</value> <value>Горячая клавиша переключения состояния окна</value>
</data> </data>
<data name="SettingsPageLyricsWindowToolTip.Content" xml:space="preserve">
<value>Окно текста</value>
</data>
<data name="SettingsPageMatchingThreshold.Description" xml:space="preserve"> <data name="SettingsPageMatchingThreshold.Description" xml:space="preserve">
<value>Настройка этого значения повлияет на результаты последовательного поиска и поиска лучшего совпадения, но не повлияет на результаты в интерфейсе ручного поиска</value> <value>Настройка этого значения повлияет на результаты последовательного поиска и поиска лучшего совпадения, но не повлияет на результаты в интерфейсе ручного поиска</value>
</data> </data>
@@ -1248,18 +1176,12 @@
<data name="SettingsPageMusicLib.Header" xml:space="preserve"> <data name="SettingsPageMusicLib.Header" xml:space="preserve">
<value>Локальная медиатека</value> <value>Локальная медиатека</value>
</data> </data>
<data name="SettingsPageMusicLibRealTimeWatch.Header" xml:space="preserve">
<value>Следить за изменениями файлов в реальном времени</value>
</data>
<data name="SettingsPageNarrowMode.Text" xml:space="preserve"> <data name="SettingsPageNarrowMode.Text" xml:space="preserve">
<value>Узкий режим</value> <value>Узкий режим</value>
</data> </data>
<data name="SettingsPageNextSongHotKey.Header" xml:space="preserve"> <data name="SettingsPageNextSongHotKey.Header" xml:space="preserve">
<value>Горячая клавиша следующего трека</value> <value>Горячая клавиша следующего трека</value>
</data> </data>
<data name="SettingsPageNoBackdrop.Content" xml:space="preserve">
<value>Нет</value>
</data>
<data name="SettingsPageOctTree.Content" xml:space="preserve"> <data name="SettingsPageOctTree.Content" xml:space="preserve">
<value>Агрессивный</value> <value>Агрессивный</value>
</data> </data>
@@ -1287,9 +1209,6 @@
<data name="SettingsPagePathIncludingOthersInfo" xml:space="preserve"> <data name="SettingsPagePathIncludingOthersInfo" xml:space="preserve">
<value>Эта папка содержит уже добавленные папки, удалите их, чтобы добавить эту папку</value> <value>Эта папка содержит уже добавленные папки, удалите их, чтобы добавить эту папку</value>
</data> </data>
<data name="SettingsPagePathNotFound.Text" xml:space="preserve">
<value>Не удается найти этот путь на вашем компьютере</value>
</data>
<data name="SettingsPagePatrons.Text" xml:space="preserve"> <data name="SettingsPagePatrons.Text" xml:space="preserve">
<value>Спонсоры</value> <value>Спонсоры</value>
</data> </data>
@@ -1335,15 +1254,9 @@
<data name="SettingsPageRealtimeStatus.Text" xml:space="preserve"> <data name="SettingsPageRealtimeStatus.Text" xml:space="preserve">
<value>Статус в реальном времени</value> <value>Статус в реальном времени</value>
</data> </data>
<data name="SettingsPageRecord.Content" xml:space="preserve">
<value>Запись</value>
</data>
<data name="SettingsPageRecordedWindowStatus.Text" xml:space="preserve"> <data name="SettingsPageRecordedWindowStatus.Text" xml:space="preserve">
<value>Записанные состояния окон</value> <value>Записанные состояния окон</value>
</data> </data>
<data name="SettingsPageReference.Header" xml:space="preserve">
<value>Справочные ссылки</value>
</data>
<data name="SettingsPageRefreshDropdown.Content" xml:space="preserve"> <data name="SettingsPageRefreshDropdown.Content" xml:space="preserve">
<value>Обновить выпадающий список</value> <value>Обновить выпадающий список</value>
</data> </data>
@@ -1362,9 +1275,6 @@
<data name="SettingsPageRight.Content" xml:space="preserve"> <data name="SettingsPageRight.Content" xml:space="preserve">
<value>Справа</value> <value>Справа</value>
</data> </data>
<data name="SettingsPageRomaji.Header" xml:space="preserve">
<value>Японская фонетика</value>
</data>
<data name="SettingsPageScope.Header" xml:space="preserve"> <data name="SettingsPageScope.Header" xml:space="preserve">
<value>Область</value> <value>Область</value>
</data> </data>
@@ -1404,6 +1314,9 @@
<data name="SettingsPageSettingsManager.Header" xml:space="preserve"> <data name="SettingsPageSettingsManager.Header" xml:space="preserve">
<value>Менеджер настроек</value> <value>Менеджер настроек</value>
</data> </data>
<data name="SettingsPageSettingsPlayHistory.Header" xml:space="preserve">
<value>История игры</value>
</data>
<data name="SettingsPageShareHub.Content" xml:space="preserve"> <data name="SettingsPageShareHub.Content" xml:space="preserve">
<value>Просмотреть онлайн-центр обмена</value> <value>Просмотреть онлайн-центр обмена</value>
</data> </data>
@@ -1431,18 +1344,12 @@
<data name="SettingsPageShowInSwitchers.Header" xml:space="preserve"> <data name="SettingsPageShowInSwitchers.Header" xml:space="preserve">
<value>Показывать в системном окружении</value> <value>Показывать в системном окружении</value>
</data> </data>
<data name="SettingsPageShowLayoutDragger.Header" xml:space="preserve">
<value>Показывать разделитель макета</value>
</data>
<data name="SettingsPageShowTitle.Header" xml:space="preserve"> <data name="SettingsPageShowTitle.Header" xml:space="preserve">
<value>Показывать название</value> <value>Показывать название</value>
</data> </data>
<data name="SettingsPageSlide.Content" xml:space="preserve"> <data name="SettingsPageSlide.Content" xml:space="preserve">
<value>Слайд</value> <value>Слайд</value>
</data> </data>
<data name="SettingsPageSliderPrefix.Text" xml:space="preserve">
<value>Текущее значение: </value>
</data>
<data name="SettingsPageSnowFlakeLayer.Header" xml:space="preserve"> <data name="SettingsPageSnowFlakeLayer.Header" xml:space="preserve">
<value>Слой снежинок</value> <value>Слой снежинок</value>
</data> </data>
@@ -1485,6 +1392,9 @@
<data name="SettingsPageStartup.Text" xml:space="preserve"> <data name="SettingsPageStartup.Text" xml:space="preserve">
<value>Запуск</value> <value>Запуск</value>
</data> </data>
<data name="SettingsPageStats.Content" xml:space="preserve">
<value>Статистика</value>
</data>
<data name="SettingsPageStopTrackOnGalleryWindowClosed.Header" xml:space="preserve"> <data name="SettingsPageStopTrackOnGalleryWindowClosed.Header" xml:space="preserve">
<value>Останавливать воспроизведение при закрытии Галереи</value> <value>Останавливать воспроизведение при закрытии Галереи</value>
</data> </data>
@@ -1503,9 +1413,6 @@
<data name="SettingsPageTaskbarPlacement.Header" xml:space="preserve"> <data name="SettingsPageTaskbarPlacement.Header" xml:space="preserve">
<value>Положение закрепления на панели задач</value> <value>Положение закрепления на панели задач</value>
</data> </data>
<data name="SettingsPageThanksForPurchasing.Text" xml:space="preserve">
<value>Спасибо за покупку BetterLyrics</value>
</data>
<data name="SettingsPageThanksList.Header" xml:space="preserve"> <data name="SettingsPageThanksList.Header" xml:space="preserve">
<value>Благодарности</value> <value>Благодарности</value>
</data> </data>
@@ -1524,12 +1431,6 @@
<data name="SettingsPageTitleBarAreaWhole.Content" xml:space="preserve"> <data name="SettingsPageTitleBarAreaWhole.Content" xml:space="preserve">
<value>Все окно</value> <value>Все окно</value>
</data> </data>
<data name="SettingsPageTitleBarType.Header" xml:space="preserve">
<value>Размер заголовка</value>
</data>
<data name="SettingsPageToggleHotKey.Header" xml:space="preserve">
<value>Горячая клавиша переключения (Вкл/Выкл)</value>
</data>
<data name="SettingsPageTranslatedText.Header" xml:space="preserve"> <data name="SettingsPageTranslatedText.Header" xml:space="preserve">
<value>Перевод</value> <value>Перевод</value>
</data> </data>
@@ -1539,9 +1440,6 @@
<data name="SettingsPageTranslationConfig.Header" xml:space="preserve"> <data name="SettingsPageTranslationConfig.Header" xml:space="preserve">
<value>Сервис LibreTranslate</value> <value>Сервис LibreTranslate</value>
</data> </data>
<data name="SettingsPageTranslationInfoLink.Text" xml:space="preserve">
<value>Посетите https://github.com/LibreTranslate/LibreTranslate для инструкции по установке и дополнительной информации (Это ПО не связано с данным сервисом)</value>
</data>
<data name="SettingsPageUserWhoPurchased.Text" xml:space="preserve"> <data name="SettingsPageUserWhoPurchased.Text" xml:space="preserve">
<value>И пользователям, купившим BetterLyrics</value> <value>И пользователям, купившим BetterLyrics</value>
</data> </data>
@@ -1554,9 +1452,6 @@
<data name="SettingsPageWidth.Header" xml:space="preserve"> <data name="SettingsPageWidth.Header" xml:space="preserve">
<value>Ширина</value> <value>Ширина</value>
</data> </data>
<data name="SettingsPageWindowBounds.Header" xml:space="preserve">
<value>Границы окна</value>
</data>
<data name="SettingsPageWorkArea.Description" xml:space="preserve"> <data name="SettingsPageWorkArea.Description" xml:space="preserve">
<value>Как отдельная рабочая область, прикрепленная к верхнему/нижнему краю экрана</value> <value>Как отдельная рабочая область, прикрепленная к верхнему/нижнему краю экрана</value>
</data> </data>
@@ -1572,6 +1467,39 @@
<data name="StandardMode" xml:space="preserve"> <data name="StandardMode" xml:space="preserve">
<value>Стандартный режим</value> <value>Стандартный режим</value>
</data> </data>
<data name="StatsDashboardControlSources.Text" xml:space="preserve">
<value>Источники</value>
</data>
<data name="StatsDashboardControlThisMonth.Header" xml:space="preserve">
<value>Этот месяц</value>
</data>
<data name="StatsDashboardControlThisQuarter.Header" xml:space="preserve">
<value>Этот квартал</value>
</data>
<data name="StatsDashboardControlThisWeek.Header" xml:space="preserve">
<value>На этой неделе</value>
</data>
<data name="StatsDashboardControlThisYear.Header" xml:space="preserve">
<value>В этом году</value>
</data>
<data name="StatsDashboardControlToday.Header" xml:space="preserve">
<value>Сегодня</value>
</data>
<data name="StatsDashboardControlTopArtists.Text" xml:space="preserve">
<value>Лучшие художники</value>
</data>
<data name="StatsDashboardControlTopSongs.Text" xml:space="preserve">
<value>Лучшие треки</value>
</data>
<data name="StatsDashboardControlTopSource.Text" xml:space="preserve">
<value>Верхний источник</value>
</data>
<data name="StatsDashboardControlTotalDuration.Text" xml:space="preserve">
<value>Общая продолжительность</value>
</data>
<data name="StatsDashboardControlTracksPlayed.Text" xml:space="preserve">
<value>Воспроизведенные треки</value>
</data>
<data name="SystemTrayExit.Text" xml:space="preserve"> <data name="SystemTrayExit.Text" xml:space="preserve">
<value>Выход</value> <value>Выход</value>
</data> </data>
@@ -1581,9 +1509,6 @@
<data name="SystemTrayMusicGallery.Text" xml:space="preserve"> <data name="SystemTrayMusicGallery.Text" xml:space="preserve">
<value>Открыть Музыкальную галерею</value> <value>Открыть Музыкальную галерею</value>
</data> </data>
<data name="SystemTrayPageTitle" xml:space="preserve">
<value>Системный трей - BetterLyrics</value>
</data>
<data name="SystemTrayResetWindowPosition.Text" xml:space="preserve"> <data name="SystemTrayResetWindowPosition.Text" xml:space="preserve">
<value>Сбросить положение окна</value> <value>Сбросить положение окна</value>
</data> </data>

View File

@@ -129,21 +129,12 @@
<data name="AlbumArtSearchSMTCProvider" xml:space="preserve"> <data name="AlbumArtSearchSMTCProvider" xml:space="preserve">
<value>เครื่องเล่นเพลง</value> <value>เครื่องเล่นเพลง</value>
</data> </data>
<data name="AllLyricsSettingsControlPictureInPicture.Content" xml:space="preserve">
<value>โหมดภาพซ้อนภาพ (PiP)</value>
</data>
<data name="AppSettingsControlGeneral.Text" xml:space="preserve"> <data name="AppSettingsControlGeneral.Text" xml:space="preserve">
<value>หน้าต่าง</value> <value>หน้าต่าง</value>
</data> </data>
<data name="ArtistsSplitHint.Text" xml:space="preserve"> <data name="ArtistsSplitHint.Text" xml:space="preserve">
<value>เมื่อป้อนศิลปินหลายคน โปรดใช้ตัวคั่นต่อไปนี้เพื่อแยก (ห้ามใช้ปนกัน)</value> <value>เมื่อป้อนศิลปินหลายคน โปรดใช้ตัวคั่นต่อไปนี้เพื่อแยก (ห้ามใช้ปนกัน)</value>
</data> </data>
<data name="BaseWindowHostInfoBarCheckBox.Content" xml:space="preserve">
<value>ไม่ต้องแสดงข้อความนี้อีก</value>
</data>
<data name="BaseWindowMiniFlyoutItem.Text" xml:space="preserve">
<value>โหมดภาพซ้อนภาพ (PiP)</value>
</data>
<data name="Cancel" xml:space="preserve"> <data name="Cancel" xml:space="preserve">
<value>ยกเลิก</value> <value>ยกเลิก</value>
</data> </data>
@@ -168,24 +159,45 @@
<data name="DockedMode" xml:space="preserve"> <data name="DockedMode" xml:space="preserve">
<value>โหมดเชื่อมต่อ (Docked)</value> <value>โหมดเชื่อมต่อ (Docked)</value>
</data> </data>
<data name="Error" xml:space="preserve">
<value>ข้อผิดพลาด</value>
</data>
<data name="ExportSettingsSuccess" xml:space="preserve"> <data name="ExportSettingsSuccess" xml:space="preserve">
<value>ส่งออกสำเร็จ</value> <value>ส่งออกสำเร็จ</value>
</data> </data>
<data name="FailToStartLXMusicServer" xml:space="preserve"> <data name="FailToStartLXMusicServer" xml:space="preserve">
<value>ไม่สามารถเชื่อมต่อกับเซิร์ฟเวอร์ LX Music โปรดไปที่ การตั้งค่า - แหล่งเล่นเพลง - LX Music - เซิร์ฟเวอร์ LX Music เพื่อตรวจสอบว่าป้อนลิงก์ถูกต้องหรือไม่</value> <value>ไม่สามารถเชื่อมต่อกับเซิร์ฟเวอร์ LX Music โปรดไปที่ การตั้งค่า - แหล่งเล่นเพลง - LX Music - เซิร์ฟเวอร์ LX Music เพื่อตรวจสอบว่าป้อนลิงก์ถูกต้องหรือไม่</value>
</data> </data>
<data name="FileSystemServiceCleaningCache" xml:space="preserve">
<value>กำลังล้างแคช...</value>
</data>
<data name="FileSystemServiceConnectFailed" xml:space="preserve">
<value>การเชื่อมต่อล้มเหลว</value>
</data>
<data name="FileSystemServiceConnecting" xml:space="preserve">
<value>กำลังเชื่อมต่อ...</value>
</data>
<data name="FileSystemServiceFetchingFileList" xml:space="preserve">
<value>กำลังดึงรายการไฟล์...</value>
</data>
<data name="FileSystemServiceParsing" xml:space="preserve">
<value>กำลังแยกวิเคราะห์...</value>
</data>
<data name="FileSystemServicePrepareToClean" xml:space="preserve">
<value>กำลังเตรียมล้างแคช...</value>
</data>
<data name="FileSystemServiceReady" xml:space="preserve">
<value>พร้อม</value>
</data>
<data name="FileSystemServiceRootDirectoryWarning" xml:space="preserve">
<value>พบเส้นทางไดเรกทอรีรากแล้ว ดัชนีของดิสก์ทั้งหมดอาจมีไฟล์ที่ไม่ใช่สื่อจำนวนมากและทำให้การสแกนใช้เวลานานเกินไป ขอแนะนำให้ระบุไดเรกทอรีย่อยเฉพาะ</value>
</data>
<data name="FileSystemServiceWaitingForScan" xml:space="preserve">
<value>กำลังรอสแกน...</value>
</data>
<data name="FullscreenMode" xml:space="preserve"> <data name="FullscreenMode" xml:space="preserve">
<value>โหมดเต็มหน้าจอ</value> <value>โหมดเต็มหน้าจอ</value>
</data> </data>
<data name="HostWindowClickThroughButton.Content" xml:space="preserve">
<value>ล็อก</value>
</data>
<data name="HostWindowClickThroughFlyoutItem.Text" xml:space="preserve">
<value>ล็อก</value>
</data>
<data name="HostWindowLockToolTip.Text" xml:space="preserve">
<value>ล็อก</value>
</data>
<data name="HostWindowMusicGalleryButtonToolTip.Content" xml:space="preserve"> <data name="HostWindowMusicGalleryButtonToolTip.Content" xml:space="preserve">
<value>คลังเพลง</value> <value>คลังเพลง</value>
</data> </data>
@@ -204,9 +216,6 @@
<data name="Jyutping" xml:space="preserve"> <data name="Jyutping" xml:space="preserve">
<value>ยุทพิง (กวางตุ้ง)</value> <value>ยุทพิง (กวางตุ้ง)</value>
</data> </data>
<data name="KeepAtLeastOneStatusDefault" xml:space="preserve">
<value>โปรดตรวจสอบให้แน่ใจว่ามีสถานะอย่างน้อยหนึ่งรายการถูกตั้งเป็นค่าเริ่มต้น</value>
</data>
<data name="LastFMAuthFailed" xml:space="preserve"> <data name="LastFMAuthFailed" xml:space="preserve">
<value>การอนุญาตล้มเหลว โปรดลองอีกครั้ง</value> <value>การอนุญาตล้มเหลว โปรดลองอีกครั้ง</value>
</data> </data>
@@ -270,18 +279,12 @@
<data name="LyricsPageSettings.Text" xml:space="preserve"> <data name="LyricsPageSettings.Text" xml:space="preserve">
<value>การตั้งค่า</value> <value>การตั้งค่า</value>
</data> </data>
<data name="LyricsPageTimelineOffsetButtonToolTip.Content" xml:space="preserve">
<value>การชดเชยเวลาเนื้อเพลง</value>
</data>
<data name="LyricsPageTranslationEnabled.Description" xml:space="preserve"> <data name="LyricsPageTranslationEnabled.Description" xml:space="preserve">
<value>จะให้ความสำคัญกับการอ่านคำแปลในเนื้อเพลงก่อน หากไม่พบจะขอคำแปลจากเครื่องผ่านเซิร์ฟเวอร์ LibreTranslate</value> <value>จะให้ความสำคัญกับการอ่านคำแปลในเนื้อเพลงก่อน หากไม่พบจะขอคำแปลจากเครื่องผ่านเซิร์ฟเวอร์ LibreTranslate</value>
</data> </data>
<data name="LyricsPageTranslationEnabled.Header" xml:space="preserve"> <data name="LyricsPageTranslationEnabled.Header" xml:space="preserve">
<value>เปิดใช้งานการแปล</value> <value>เปิดใช้งานการแปล</value>
</data> </data>
<data name="LyricsPageTranslationOnly.Header" xml:space="preserve">
<value>แสดงเฉพาะคำแปล</value>
</data>
<data name="LyricsPageTranslationProviderPrefix.Header" xml:space="preserve"> <data name="LyricsPageTranslationProviderPrefix.Header" xml:space="preserve">
<value>ผู้ให้บริการคำแปล</value> <value>ผู้ให้บริการคำแปล</value>
</data> </data>
@@ -330,9 +333,6 @@
<data name="LyricsSearchControlSongInfoMapping.Text" xml:space="preserve"> <data name="LyricsSearchControlSongInfoMapping.Text" xml:space="preserve">
<value>การจับคู่ข้อมูลเพลง</value> <value>การจับคู่ข้อมูลเพลง</value>
</data> </data>
<data name="LyricsSearchControlTargetSearchProvider.Header" xml:space="preserve">
<value>ผู้ให้บริการค้นหาเนื้อเพลงเป้าหมาย</value>
</data>
<data name="LyricsSearchControlTitle.Header" xml:space="preserve"> <data name="LyricsSearchControlTitle.Header" xml:space="preserve">
<value>ชื่อเพลง</value> <value>ชื่อเพลง</value>
</data> </data>
@@ -351,15 +351,9 @@
<data name="LyricsSearchProviderTtmlFile" xml:space="preserve"> <data name="LyricsSearchProviderTtmlFile" xml:space="preserve">
<value>ไฟล์ .TTML ในเครื่อง</value> <value>ไฟล์ .TTML ในเครื่อง</value>
</data> </data>
<data name="LyricsWindowImmersiveButtonToolTip.Content" xml:space="preserve">
<value>โหมดดื่มด่ำ</value>
</data>
<data name="LyricsWindowSettingsControlLyricsWindowConfig.Text" xml:space="preserve"> <data name="LyricsWindowSettingsControlLyricsWindowConfig.Text" xml:space="preserve">
<value>การกำหนดค่า</value> <value>การกำหนดค่า</value>
</data> </data>
<data name="LyricsWindowSettingsControlLyricsWindowMode.Header" xml:space="preserve">
<value>โหมดหน้าต่างเนื้อเพลง</value>
</data>
<data name="LyricsWindowSettingsControlSetDefault.Text" xml:space="preserve"> <data name="LyricsWindowSettingsControlSetDefault.Text" xml:space="preserve">
<value>ตั้งเป็นค่าเริ่มต้น</value> <value>ตั้งเป็นค่าเริ่มต้น</value>
</data> </data>
@@ -378,9 +372,6 @@
<data name="MainPageAlbumArtOnly.Content" xml:space="preserve"> <data name="MainPageAlbumArtOnly.Content" xml:space="preserve">
<value>แสดงเฉพาะส่วนปกอัลบั้ม</value> <value>แสดงเฉพาะส่วนปกอัลบั้ม</value>
</data> </data>
<data name="MainPageEnterImmersiveModeHint" xml:space="preserve">
<value>วางเมาส์อีกครั้งเพื่อแสดงปุ่มสลับ</value>
</data>
<data name="MainPageLyriscOnly.Content" xml:space="preserve"> <data name="MainPageLyriscOnly.Content" xml:space="preserve">
<value>แสดงเฉพาะเนื้อเพลง</value> <value>แสดงเฉพาะเนื้อเพลง</value>
</data> </data>
@@ -396,6 +387,18 @@
<data name="MainPageSplitView.Content" xml:space="preserve"> <data name="MainPageSplitView.Content" xml:space="preserve">
<value>มุมมองแยก</value> <value>มุมมองแยก</value>
</data> </data>
<data name="MediaSettingsControlLastSyncTime.Header" xml:space="preserve">
<value>เวลาซิงค์ครั้งล่าสุด</value>
</data>
<data name="MediaSettingsControlLocalFolder" xml:space="preserve">
<value>โฟลเดอร์ท้องถิ่น</value>
</data>
<data name="MediaSettingsControlNameSetting.Header" xml:space="preserve">
<value>ชื่อ</value>
</data>
<data name="MediaSettingsControlSyncNow.Content" xml:space="preserve">
<value>ซิงค์ตอนนี้</value>
</data>
<data name="MusicGalleryPageAddToCustomList.Text" xml:space="preserve"> <data name="MusicGalleryPageAddToCustomList.Text" xml:space="preserve">
<value>เพิ่มลงในเพลย์ลิสต์</value> <value>เพิ่มลงในเพลย์ลิสต์</value>
</data> </data>
@@ -411,6 +414,12 @@
<data name="MusicGalleryPageAllSongs" xml:space="preserve"> <data name="MusicGalleryPageAllSongs" xml:space="preserve">
<value>เพลงทั้งหมด</value> <value>เพลงทั้งหมด</value>
</data> </data>
<data name="MusicGalleryPageDataSync.Message" xml:space="preserve">
<value>กำลังซิงค์คลังสื่อ...</value>
</data>
<data name="MusicGalleryPageDataSyncError.Message" xml:space="preserve">
<value>มีปัญหาเกี่ยวกับการซิงค์ไลบรารีมีเดีย</value>
</data>
<data name="MusicGalleryPageEmptyPlayingQueue.Text" xml:space="preserve"> <data name="MusicGalleryPageEmptyPlayingQueue.Text" xml:space="preserve">
<value>ล้างคิวการเล่น</value> <value>ล้างคิวการเล่น</value>
</data> </data>
@@ -420,9 +429,6 @@
<data name="MusicGalleryPageFileArtist.Header" xml:space="preserve"> <data name="MusicGalleryPageFileArtist.Header" xml:space="preserve">
<value>ศิลปิน</value> <value>ศิลปิน</value>
</data> </data>
<data name="MusicGalleryPageFileInfo.Text" xml:space="preserve">
<value>ข้อมูลไฟล์</value>
</data>
<data name="MusicGalleryPageFileInfoBitDepth.Header" xml:space="preserve"> <data name="MusicGalleryPageFileInfoBitDepth.Header" xml:space="preserve">
<value>ความลึกของบิต</value> <value>ความลึกของบิต</value>
</data> </data>
@@ -456,15 +462,15 @@
<data name="MusicGalleryPageFileNotFound.Text" xml:space="preserve"> <data name="MusicGalleryPageFileNotFound.Text" xml:space="preserve">
<value>ไม่พบเพลงในไลบรารีสื่อ</value> <value>ไม่พบเพลงในไลบรารีสื่อ</value>
</data> </data>
<data name="MusicGalleryPageFolder.Text" xml:space="preserve">
<value>โฟลเดอร์</value>
</data>
<data name="MusicGalleryPageImportFromFile.Text" xml:space="preserve"> <data name="MusicGalleryPageImportFromFile.Text" xml:space="preserve">
<value>นำเข้าจากไฟล์</value> <value>นำเข้าจากไฟล์</value>
</data> </data>
<data name="MusicGalleryPageNewPlaylist.Text" xml:space="preserve"> <data name="MusicGalleryPageNewPlaylist.Text" xml:space="preserve">
<value>สร้างเพลย์ลิสต์</value> <value>สร้างเพลย์ลิสต์</value>
</data> </data>
<data name="MusicGalleryPagePlayAll.Content" xml:space="preserve">
<value>เล่นทั้งหมด</value>
</data>
<data name="MusicGalleryPagePlayingQueue.Text" xml:space="preserve"> <data name="MusicGalleryPagePlayingQueue.Text" xml:space="preserve">
<value>คิวการเล่น</value> <value>คิวการเล่น</value>
</data> </data>
@@ -489,9 +495,6 @@
<data name="MusicGalleryPageScrollToPlayingItem.Text" xml:space="preserve"> <data name="MusicGalleryPageScrollToPlayingItem.Text" xml:space="preserve">
<value>เลื่อนไปยังรายการที่เล่นอยู่</value> <value>เลื่อนไปยังรายการที่เล่นอยู่</value>
</data> </data>
<data name="MusicGalleryPageSelectAll.Content" xml:space="preserve">
<value>เลือกทั้งหมด</value>
</data>
<data name="MusicGalleryPageSingleLoop.Text" xml:space="preserve"> <data name="MusicGalleryPageSingleLoop.Text" xml:space="preserve">
<value>วนซ้ำเพลงเดียว</value> <value>วนซ้ำเพลงเดียว</value>
</data> </data>
@@ -513,20 +516,29 @@
<data name="MusicGalleryPageSortType.Text" xml:space="preserve"> <data name="MusicGalleryPageSortType.Text" xml:space="preserve">
<value>ประเภทการเรียงลำดับ</value> <value>ประเภทการเรียงลำดับ</value>
</data> </data>
<data name="MusicGalleryPageStarredPlaylist.Content" xml:space="preserve">
<value>เพลย์ลิสต์ที่ติดดาว</value>
</data>
<data name="MusicGalleryPageStopTrack.Text" xml:space="preserve"> <data name="MusicGalleryPageStopTrack.Text" xml:space="preserve">
<value>หยุด</value> <value>หยุด</value>
</data> </data>
<data name="MusicGalleryPageTitle" xml:space="preserve"> <data name="MusicGalleryPageTitle" xml:space="preserve">
<value>คลังเพลง - BetterLyrics</value> <value>คลังเพลง - BetterLyrics</value>
</data> </data>
<data name="MusicGalleryWindowDownButtonToolTip.Content" xml:space="preserve"> <data name="MusicSettingsControlAutoSyncInterval.Header" xml:space="preserve">
<value>ยุบ</value> <value>ความถี่การซิงค์อัตโนมัติ</value>
</data> </data>
<data name="MusicGalleryWindowUpButtonToolTip.Content" xml:space="preserve"> <data name="MusicSettingsControlAutoSyncIntervalDisabled.Content" xml:space="preserve">
<value>ขยาย</value> <value>ไม่เคย</value>
</data>
<data name="MusicSettingsControlAutoSyncIntervalEveryDay.Content" xml:space="preserve">
<value>ทุกวัน</value>
</data>
<data name="MusicSettingsControlAutoSyncIntervalEveryFifteenMin.Content" xml:space="preserve">
<value>ทุก 15 นาที</value>
</data>
<data name="MusicSettingsControlAutoSyncIntervalEveryHour.Content" xml:space="preserve">
<value>ทุกชั่วโมง</value>
</data>
<data name="MusicSettingsControlAutoSyncIntervalEverySixHrs.Content" xml:space="preserve">
<value>ทุก 6 ชั่วโมง</value>
</data> </data>
<data name="NarrowMode" xml:space="preserve"> <data name="NarrowMode" xml:space="preserve">
<value>โหมดหน้าแคบ</value> <value>โหมดหน้าแคบ</value>
@@ -543,12 +555,27 @@
<data name="PrivacyPolicy.Content" xml:space="preserve"> <data name="PrivacyPolicy.Content" xml:space="preserve">
<value>นโยบายความเป็นส่วนตัว</value> <value>นโยบายความเป็นส่วนตัว</value>
</data> </data>
<data name="RemoteServerConfigControlBrowse.Content" xml:space="preserve">
<value>เรียกดู</value>
</data>
<data name="RemoteServerConfigControlName.Header" xml:space="preserve">
<value>ชื่อ</value>
</data>
<data name="RemoteServerConfigControlName.PlaceholderText" xml:space="preserve">
<value>การเว้นว่างไว้จะสร้างชื่อเริ่มต้นโดยอัตโนมัติ</value>
</data>
<data name="RemoteServerConfigControlPassword.Header" xml:space="preserve"> <data name="RemoteServerConfigControlPassword.Header" xml:space="preserve">
<value>รหัสผ่าน</value> <value>รหัสผ่าน</value>
</data> </data>
<data name="RemoteServerConfigControlPath.Header" xml:space="preserve"> <data name="RemoteServerConfigControlPath.Header" xml:space="preserve">
<value>เส้นทาง</value> <value>เส้นทาง</value>
</data> </data>
<data name="RemoteServerConfigControlPathNotExisted" xml:space="preserve">
<value>ไม่สามารถค้นหาเส้นทางโฟลเดอร์ที่ระบุได้</value>
</data>
<data name="RemoteServerConfigControlPathRequired" xml:space="preserve">
<value>จำเป็นต้องมีเส้นทาง</value>
</data>
<data name="RemoteServerConfigControlPort.Header" xml:space="preserve"> <data name="RemoteServerConfigControlPort.Header" xml:space="preserve">
<value>พอร์ต</value> <value>พอร์ต</value>
</data> </data>
@@ -576,9 +603,6 @@
<data name="SetingsPageFeedback.Text" xml:space="preserve"> <data name="SetingsPageFeedback.Text" xml:space="preserve">
<value>ข้อเสนอแนะ</value> <value>ข้อเสนอแนะ</value>
</data> </data>
<data name="SetingsPageInstructions.Text" xml:space="preserve">
<value>คู่มือการใช้งาน</value>
</data>
<data name="SetingsPageSpecialThanks.Text" xml:space="preserve"> <data name="SetingsPageSpecialThanks.Text" xml:space="preserve">
<value>ขอขอบคุณเป็นพิเศษ</value> <value>ขอขอบคุณเป็นพิเศษ</value>
</data> </data>
@@ -606,9 +630,6 @@
<data name="SettingsPageAddFolderButton.Content" xml:space="preserve"> <data name="SettingsPageAddFolderButton.Content" xml:space="preserve">
<value>เพิ่ม</value> <value>เพิ่ม</value>
</data> </data>
<data name="SettingsPageAdvanced.Text" xml:space="preserve">
<value>ตัวเลือกขั้นสูง</value>
</data>
<data name="SettingsPageAlbum.Header" xml:space="preserve"> <data name="SettingsPageAlbum.Header" xml:space="preserve">
<value>อัลบั้ม</value> <value>อัลบั้ม</value>
</data> </data>
@@ -624,15 +645,9 @@
<data name="SettingsPageAlbumArtSearchProvidersConfig.Text" xml:space="preserve"> <data name="SettingsPageAlbumArtSearchProvidersConfig.Text" xml:space="preserve">
<value>กำหนดค่าแหล่งที่มาปกอัลบั้ม</value> <value>กำหนดค่าแหล่งที่มาปกอัลบั้ม</value>
</data> </data>
<data name="SettingsPageAlbumArtSize.Header" xml:space="preserve">
<value>ขนาดปกอัลบั้ม</value>
</data>
<data name="SettingsPageAlbumEffect.Text" xml:space="preserve"> <data name="SettingsPageAlbumEffect.Text" xml:space="preserve">
<value>เอฟเฟกต์ปกอัลบั้ม</value> <value>เอฟเฟกต์ปกอัลบั้ม</value>
</data> </data>
<data name="SettingsPageAlbumLib.Content" xml:space="preserve">
<value>แหล่งที่มาปกอัลบั้ม</value>
</data>
<data name="SettingsPageAlbumRadius.Header" xml:space="preserve"> <data name="SettingsPageAlbumRadius.Header" xml:space="preserve">
<value>รัศมีมุมโค้ง</value> <value>รัศมีมุมโค้ง</value>
</data> </data>
@@ -663,12 +678,6 @@
<data name="SettingsPageAppAppearance.Text" xml:space="preserve"> <data name="SettingsPageAppAppearance.Text" xml:space="preserve">
<value>รูปลักษณ์แอป</value> <value>รูปลักษณ์แอป</value>
</data> </data>
<data name="SettingsPageAppBehavior.Text" xml:space="preserve">
<value>พฤติกรรมทั่วไป</value>
</data>
<data name="SettingsPageApply.Content" xml:space="preserve">
<value>นำไปใช้</value>
</data>
<data name="SettingsPageArtist.Header" xml:space="preserve"> <data name="SettingsPageArtist.Header" xml:space="preserve">
<value>ศิลปิน</value> <value>ศิลปิน</value>
</data> </data>
@@ -687,23 +696,14 @@
<data name="SettingsPageAutoStart.Header" xml:space="preserve"> <data name="SettingsPageAutoStart.Header" xml:space="preserve">
<value>เริ่มทำงานอัตโนมัติ</value> <value>เริ่มทำงานอัตโนมัติ</value>
</data> </data>
<data name="SettingsPageAutoStartWindow.Header" xml:space="preserve">
<value>เมื่อเริ่มแอปพลิเคชัน</value>
</data>
<data name="SettingsPageBackdrop.Header" xml:space="preserve">
<value>วัสดุพื้นหลังเนื้อเพลง</value>
</data>
<data name="SettingsPageBackgroundOverlay.Text" xml:space="preserve"> <data name="SettingsPageBackgroundOverlay.Text" xml:space="preserve">
<value>พื้นหลังเนื้อเพลง</value> <value>พื้นหลังเนื้อเพลง</value>
</data> </data>
<data name="SettingsPageBlurAmount.Header" xml:space="preserve"> <data name="SettingsPageBlurAmount.Header" xml:space="preserve">
<value>ปริมาณความเบลอ</value> <value>ปริมาณความเบลอ</value>
</data> </data>
<data name="SettingsPageBorderless.Header" xml:space="preserve">
<value>หน้าต่างไร้ขอบ</value>
</data>
<data name="SettingsPageCache.Description" xml:space="preserve"> <data name="SettingsPageCache.Description" xml:space="preserve">
<value>รวมไฟล์บันทึก, แคชเนื้อเพลงจากเครือข่าย</value> <value>รวมถึงไฟล์บันทึก, แคชเนื้อเพลงออนไลน์</value>
</data> </data>
<data name="SettingsPageCache.Header" xml:space="preserve"> <data name="SettingsPageCache.Header" xml:space="preserve">
<value>แคช</value> <value>แคช</value>
@@ -738,9 +738,6 @@
<data name="SettingsPageCollapseDropdown.Content" xml:space="preserve"> <data name="SettingsPageCollapseDropdown.Content" xml:space="preserve">
<value>ยุบเมนูแบบเลื่อนลง</value> <value>ยุบเมนูแบบเลื่อนลง</value>
</data> </data>
<data name="SettingsPageCompactTitleBar.Content" xml:space="preserve">
<value>กะทัดรัด</value>
</data>
<data name="SettingsPageConfigName.Description" xml:space="preserve"> <data name="SettingsPageConfigName.Description" xml:space="preserve">
<value>การตั้งชื่อสถานะหน้าต่างที่บันทึกไว้จะช่วยให้คุณแยกแยะได้ดีขึ้น</value> <value>การตั้งชื่อสถานะหน้าต่างที่บันทึกไว้จะช่วยให้คุณแยกแยะได้ดีขึ้น</value>
</data> </data>
@@ -759,18 +756,12 @@
<data name="SettingsPageCrossfade.Content" xml:space="preserve"> <data name="SettingsPageCrossfade.Content" xml:space="preserve">
<value>ครอสเฟด (Crossfade)</value> <value>ครอสเฟด (Crossfade)</value>
</data> </data>
<data name="SettingsPageCurrentLyricsWindowStatus.Text" xml:space="preserve">
<value>สถานะหน้าต่างเนื้อเพลงปัจจุบัน</value>
</data>
<data name="SettingsPageCutletDockerServer.Header" xml:space="preserve"> <data name="SettingsPageCutletDockerServer.Header" xml:space="preserve">
<value>บริการคำอ่าน cutlet-docker</value> <value>บริการคำอ่าน cutlet-docker</value>
</data> </data>
<data name="SettingsPageDark.Content" xml:space="preserve"> <data name="SettingsPageDark.Content" xml:space="preserve">
<value>มืด</value> <value>มืด</value>
</data> </data>
<data name="SettingsPageDebugOverlay.Header" xml:space="preserve">
<value>แสดงโอเวอร์เลย์ดีบัก</value>
</data>
<data name="SettingsPageDelete.Text" xml:space="preserve"> <data name="SettingsPageDelete.Text" xml:space="preserve">
<value>ลบ</value> <value>ลบ</value>
</data> </data>
@@ -801,15 +792,9 @@
<data name="SettingsPageDockPlacementTop.Content" xml:space="preserve"> <data name="SettingsPageDockPlacementTop.Content" xml:space="preserve">
<value>ด้านบน</value> <value>ด้านบน</value>
</data> </data>
<data name="SettingsPageDockWindowHeight.Header" xml:space="preserve">
<value>ความสูงหน้าต่าง</value>
</data>
<data name="SettingsPageDragArea.Header" xml:space="preserve"> <data name="SettingsPageDragArea.Header" xml:space="preserve">
<value>พื้นที่ลาก</value> <value>พื้นที่ลาก</value>
</data> </data>
<data name="SettingsPageEasingFuncType.Header" xml:space="preserve">
<value>ประเภทแอนิเมชัน Easing</value>
</data>
<data name="SettingsPageEasingTypeEaseInOutBack.Content" xml:space="preserve"> <data name="SettingsPageEasingTypeEaseInOutBack.Content" xml:space="preserve">
<value>EaseInOutBack</value> <value>EaseInOutBack</value>
</data> </data>
@@ -873,18 +858,15 @@
<data name="SettingsPageExitOnLyricsWindowClosed.Header" xml:space="preserve"> <data name="SettingsPageExitOnLyricsWindowClosed.Header" xml:space="preserve">
<value>ออกจากโปรแกรมเมื่อปิดหน้าต่างเนื้อเพลง</value> <value>ออกจากโปรแกรมเมื่อปิดหน้าต่างเนื้อเพลง</value>
</data> </data>
<data name="SettingsPageExportPlayHistoryButton.Content" xml:space="preserve">
<value>ส่งออกประวัติการเล่น</value>
</data>
<data name="SettingsPageExportSettingsButton.Content" xml:space="preserve"> <data name="SettingsPageExportSettingsButton.Content" xml:space="preserve">
<value>ส่งออกการตั้งค่า</value> <value>ส่งออกการตั้งค่า</value>
</data> </data>
<data name="SettingsPageExtendedTitleBar.Content" xml:space="preserve">
<value>ขยาย</value>
</data>
<data name="SettingsPageFan.Header" xml:space="preserve"> <data name="SettingsPageFan.Header" xml:space="preserve">
<value>เนื้อเพลงแบบพัด</value> <value>เนื้อเพลงแบบพัด</value>
</data> </data>
<data name="SettingsPageFAQ.Content" xml:space="preserve">
<value>คำถามที่พบบ่อย</value>
</data>
<data name="SettingsPageFixedTimeStep.Header" xml:space="preserve"> <data name="SettingsPageFixedTimeStep.Header" xml:space="preserve">
<value>เรนเดอร์ด้วย Time Step คงที่</value> <value>เรนเดอร์ด้วย Time Step คงที่</value>
</data> </data>
@@ -921,9 +903,6 @@
<data name="SettingsPageHeight.Header" xml:space="preserve"> <data name="SettingsPageHeight.Header" xml:space="preserve">
<value>ความสูง</value> <value>ความสูง</value>
</data> </data>
<data name="SettingsPageHello.Text" xml:space="preserve">
<value>สวัสดี</value>
</data>
<data name="SettingsPageHelpUsTranslate.Content" xml:space="preserve"> <data name="SettingsPageHelpUsTranslate.Content" xml:space="preserve">
<value>ช่วยเราแปลแอปพลิเคชันนี้</value> <value>ช่วยเราแปลแอปพลิเคชันนี้</value>
</data> </data>
@@ -954,9 +933,6 @@
<data name="SettingsPageJapanese.Header" xml:space="preserve"> <data name="SettingsPageJapanese.Header" xml:space="preserve">
<value>คำอ่านภาษาญี่ปุ่น</value> <value>คำอ่านภาษาญี่ปุ่น</value>
</data> </data>
<data name="SettingsPageJoinNowButton.Content" xml:space="preserve">
<value>เข้าร่วมเลย</value>
</data>
<data name="SettingsPageJyutping.Content" xml:space="preserve"> <data name="SettingsPageJyutping.Content" xml:space="preserve">
<value>ยุทพิง (กวางตุ้ง)</value> <value>ยุทพิง (กวางตุ้ง)</value>
</data> </data>
@@ -1005,18 +981,12 @@
<data name="SettingsPageLight.Content" xml:space="preserve"> <data name="SettingsPageLight.Content" xml:space="preserve">
<value>สว่าง</value> <value>สว่าง</value>
</data> </data>
<data name="SettingsPageLinkedFile.Text" xml:space="preserve">
<value>ไฟล์ในเครื่องที่เชื่อมโยง</value>
</data>
<data name="SettingsPageListenNewSession.Header" xml:space="preserve"> <data name="SettingsPageListenNewSession.Header" xml:space="preserve">
<value>เปิดใช้งานการฟังแหล่งเล่นเพลงใหม่</value> <value>เปิดใช้งานการฟังแหล่งเล่นเพลงใหม่</value>
</data> </data>
<data name="SettingsPageLocalFolder.Text" xml:space="preserve"> <data name="SettingsPageLocalFolder.Text" xml:space="preserve">
<value>โฟลเดอร์ในเครื่อง</value> <value>โฟลเดอร์ในเครื่อง</value>
</data> </data>
<data name="SettingsPageLog.Header" xml:space="preserve">
<value>การบันทึก (Log)</value>
</data>
<data name="SettingsPageLongSyllableDuration.Header" xml:space="preserve"> <data name="SettingsPageLongSyllableDuration.Header" xml:space="preserve">
<value>เกณฑ์พยางค์ยาว</value> <value>เกณฑ์พยางค์ยาว</value>
</data> </data>
@@ -1071,15 +1041,6 @@
<data name="SettingsPageLyricsFgFontColor.Header" xml:space="preserve"> <data name="SettingsPageLyricsFgFontColor.Header" xml:space="preserve">
<value>บรรทัดปัจจุบัน</value> <value>บรรทัดปัจจุบัน</value>
</data> </data>
<data name="SettingsPageLyricsFgFontColorAdaptiveColored.Content" xml:space="preserve">
<value>ปรับตามพื้นหลังเนื้อเพลง (สี)</value>
</data>
<data name="SettingsPageLyricsFgFontColorAdaptiveGrayed.Content" xml:space="preserve">
<value>ปรับตามพื้นหลังเนื้อเพลง (เทา)</value>
</data>
<data name="SettingsPageLyricsFgFontColorCustom.Content" xml:space="preserve">
<value>กำหนดเอง</value>
</data>
<data name="SettingsPageLyricsFloatAnimation.Header" xml:space="preserve"> <data name="SettingsPageLyricsFloatAnimation.Header" xml:space="preserve">
<value>แอนิเมชันลอยตัว</value> <value>แอนิเมชันลอยตัว</value>
</data> </data>
@@ -1107,27 +1068,12 @@
<data name="SettingsPageLyricsGlowEffect.Header" xml:space="preserve"> <data name="SettingsPageLyricsGlowEffect.Header" xml:space="preserve">
<value>เอฟเฟกต์เรืองแสง</value> <value>เอฟเฟกต์เรืองแสง</value>
</data> </data>
<data name="SettingsPageLyricsHighlight.Header" xml:space="preserve">
<value>ไฮไลท์</value>
</data>
<data name="SettingsPageLyricsHighlightScope.Header" xml:space="preserve">
<value>ขอบเขตการไฮไลท์ข้อความต้นฉบับ</value>
</data>
<data name="SettingsPageLyricsLeft.Content" xml:space="preserve">
<value>ซ้าย</value>
</data>
<data name="SettingsPageLyricsLight.Content" xml:space="preserve"> <data name="SettingsPageLyricsLight.Content" xml:space="preserve">
<value>บาง</value> <value>บาง</value>
</data> </data>
<data name="SettingsPageLyricsLineFade.Header" xml:space="preserve">
<value>การไล่ระดับขอบพื้นที่เล่น</value>
</data>
<data name="SettingsPageLyricsLineSpacingFactor.Header" xml:space="preserve"> <data name="SettingsPageLyricsLineSpacingFactor.Header" xml:space="preserve">
<value>ระยะห่างบรรทัด</value> <value>ระยะห่างบรรทัด</value>
</data> </data>
<data name="SettingsPageLyricsLineSpacingFactorUnit.Text" xml:space="preserve">
<value> เท่าของความสูงบรรทัด</value>
</data>
<data name="SettingsPageLyricsMedium.Content" xml:space="preserve"> <data name="SettingsPageLyricsMedium.Content" xml:space="preserve">
<value>ปานกลาง</value> <value>ปานกลาง</value>
</data> </data>
@@ -1170,9 +1116,6 @@
<data name="SettingsPageLyricsSemiLight.Content" xml:space="preserve"> <data name="SettingsPageLyricsSemiLight.Content" xml:space="preserve">
<value>กึ่งบาง</value> <value>กึ่งบาง</value>
</data> </data>
<data name="SettingsPageLyricsShadow.Header" xml:space="preserve">
<value>เงา</value>
</data>
<data name="SettingsPageLyricsStyle.Text" xml:space="preserve"> <data name="SettingsPageLyricsStyle.Text" xml:space="preserve">
<value>สไตล์เนื้อเพลง</value> <value>สไตล์เนื้อเพลง</value>
</data> </data>
@@ -1188,30 +1131,15 @@
<data name="SettingsPageLyricsTimelineThreshold.Header" xml:space="preserve"> <data name="SettingsPageLyricsTimelineThreshold.Header" xml:space="preserve">
<value>เกณฑ์การซิงค์เวลาเนื้อเพลง</value> <value>เกณฑ์การซิงค์เวลาเนื้อเพลง</value>
</data> </data>
<data name="SettingsPageLyricsTranslationHighlight.Header" xml:space="preserve">
<value>ไฮไลท์คำแปล</value>
</data>
<data name="SettingsPageLyricsTranslationSeparator.Header" xml:space="preserve">
<value>ตัวคั่นต้นฉบับและคำแปล</value>
</data>
<data name="SettingsPageLyricsVerticalEdgeOpacity.Header" xml:space="preserve">
<value>ความทึบขอบแนวตั้ง</value>
</data>
<data name="SettingsPageLyricsWindow.Text" xml:space="preserve"> <data name="SettingsPageLyricsWindow.Text" xml:space="preserve">
<value>หน้าต่างเนื้อเพลง</value> <value>หน้าต่างเนื้อเพลง</value>
</data> </data>
<data name="SettingsPageLyricsWindowManager.Text" xml:space="preserve">
<value>ตัวจัดการหน้าต่างเนื้อเพลง</value>
</data>
<data name="SettingsPageLyricsWindowMgr.Content" xml:space="preserve"> <data name="SettingsPageLyricsWindowMgr.Content" xml:space="preserve">
<value>ตัวจัดการหน้าต่างเนื้อเพลง</value> <value>ตัวจัดการหน้าต่างเนื้อเพลง</value>
</data> </data>
<data name="SettingsPageLyricsWindowSwitchHotKey.Header" xml:space="preserve"> <data name="SettingsPageLyricsWindowSwitchHotKey.Header" xml:space="preserve">
<value>ทางลัดสลับสถานะหน้าต่างเนื้อเพลง</value> <value>ทางลัดสลับสถานะหน้าต่างเนื้อเพลง</value>
</data> </data>
<data name="SettingsPageLyricsWindowToolTip.Content" xml:space="preserve">
<value>หน้าต่างเนื้อเพลง</value>
</data>
<data name="SettingsPageMatchingThreshold.Description" xml:space="preserve"> <data name="SettingsPageMatchingThreshold.Description" xml:space="preserve">
<value>การปรับค่านี้จะมีผลกับผลการค้นหาแบบตามลำดับและแบบตรงกันที่สุด แต่จะไม่มีผลกับผลการค้นหาในหน้าค้นหาเนื้อเพลงด้วยตนเอง</value> <value>การปรับค่านี้จะมีผลกับผลการค้นหาแบบตามลำดับและแบบตรงกันที่สุด แต่จะไม่มีผลกับผลการค้นหาในหน้าค้นหาเนื้อเพลงด้วยตนเอง</value>
</data> </data>
@@ -1248,18 +1176,12 @@
<data name="SettingsPageMusicLib.Header" xml:space="preserve"> <data name="SettingsPageMusicLib.Header" xml:space="preserve">
<value>ไลบรารีสื่อในเครื่อง</value> <value>ไลบรารีสื่อในเครื่อง</value>
</data> </data>
<data name="SettingsPageMusicLibRealTimeWatch.Header" xml:space="preserve">
<value>เฝ้าดูการเปลี่ยนแปลงไฟล์แบบเรียลไทม์</value>
</data>
<data name="SettingsPageNarrowMode.Text" xml:space="preserve"> <data name="SettingsPageNarrowMode.Text" xml:space="preserve">
<value>โหมดหน้าแคบ</value> <value>โหมดหน้าแคบ</value>
</data> </data>
<data name="SettingsPageNextSongHotKey.Header" xml:space="preserve"> <data name="SettingsPageNextSongHotKey.Header" xml:space="preserve">
<value>ทางลัดเพลงถัดไป</value> <value>ทางลัดเพลงถัดไป</value>
</data> </data>
<data name="SettingsPageNoBackdrop.Content" xml:space="preserve">
<value>ไม่มี</value>
</data>
<data name="SettingsPageOctTree.Content" xml:space="preserve"> <data name="SettingsPageOctTree.Content" xml:space="preserve">
<value>เชิงรุก (Aggressive)</value> <value>เชิงรุก (Aggressive)</value>
</data> </data>
@@ -1287,9 +1209,6 @@
<data name="SettingsPagePathIncludingOthersInfo" xml:space="preserve"> <data name="SettingsPagePathIncludingOthersInfo" xml:space="preserve">
<value>โฟลเดอร์นี้มีโฟลเดอร์ที่เพิ่มไปแล้ว โปรดลบโฟลเดอร์เหล่านั้นออกเพื่อเพิ่มโฟลเดอร์นี้</value> <value>โฟลเดอร์นี้มีโฟลเดอร์ที่เพิ่มไปแล้ว โปรดลบโฟลเดอร์เหล่านั้นออกเพื่อเพิ่มโฟลเดอร์นี้</value>
</data> </data>
<data name="SettingsPagePathNotFound.Text" xml:space="preserve">
<value>ไม่พบเส้นทางในคอมพิวเตอร์ของคุณ</value>
</data>
<data name="SettingsPagePatrons.Text" xml:space="preserve"> <data name="SettingsPagePatrons.Text" xml:space="preserve">
<value>ผู้สนับสนุน</value> <value>ผู้สนับสนุน</value>
</data> </data>
@@ -1335,15 +1254,9 @@
<data name="SettingsPageRealtimeStatus.Text" xml:space="preserve"> <data name="SettingsPageRealtimeStatus.Text" xml:space="preserve">
<value>สถานะเรียลไทม์</value> <value>สถานะเรียลไทม์</value>
</data> </data>
<data name="SettingsPageRecord.Content" xml:space="preserve">
<value>บันทึก</value>
</data>
<data name="SettingsPageRecordedWindowStatus.Text" xml:space="preserve"> <data name="SettingsPageRecordedWindowStatus.Text" xml:space="preserve">
<value>สถานะหน้าต่างที่บันทึกไว้</value> <value>สถานะหน้าต่างที่บันทึกไว้</value>
</data> </data>
<data name="SettingsPageReference.Header" xml:space="preserve">
<value>ลิงก์อ้างอิง</value>
</data>
<data name="SettingsPageRefreshDropdown.Content" xml:space="preserve"> <data name="SettingsPageRefreshDropdown.Content" xml:space="preserve">
<value>รีเฟรชเมนู</value> <value>รีเฟรชเมนู</value>
</data> </data>
@@ -1362,9 +1275,6 @@
<data name="SettingsPageRight.Content" xml:space="preserve"> <data name="SettingsPageRight.Content" xml:space="preserve">
<value>ขวา</value> <value>ขวา</value>
</data> </data>
<data name="SettingsPageRomaji.Header" xml:space="preserve">
<value>คำอ่านภาษาญี่ปุ่น</value>
</data>
<data name="SettingsPageScope.Header" xml:space="preserve"> <data name="SettingsPageScope.Header" xml:space="preserve">
<value>ขอบเขต</value> <value>ขอบเขต</value>
</data> </data>
@@ -1404,6 +1314,9 @@
<data name="SettingsPageSettingsManager.Header" xml:space="preserve"> <data name="SettingsPageSettingsManager.Header" xml:space="preserve">
<value>ตัวจัดการการตั้งค่า</value> <value>ตัวจัดการการตั้งค่า</value>
</data> </data>
<data name="SettingsPageSettingsPlayHistory.Header" xml:space="preserve">
<value>ประวัติการเล่น</value>
</data>
<data name="SettingsPageShareHub.Content" xml:space="preserve"> <data name="SettingsPageShareHub.Content" xml:space="preserve">
<value>เรียกดูศูนย์แบ่งปันทรัพยากรออนไลน์</value> <value>เรียกดูศูนย์แบ่งปันทรัพยากรออนไลน์</value>
</data> </data>
@@ -1431,18 +1344,12 @@
<data name="SettingsPageShowInSwitchers.Header" xml:space="preserve"> <data name="SettingsPageShowInSwitchers.Header" xml:space="preserve">
<value>แสดงในสภาพแวดล้อมระบบ</value> <value>แสดงในสภาพแวดล้อมระบบ</value>
</data> </data>
<data name="SettingsPageShowLayoutDragger.Header" xml:space="preserve">
<value>แสดงตัวแบ่งเค้าโครง</value>
</data>
<data name="SettingsPageShowTitle.Header" xml:space="preserve"> <data name="SettingsPageShowTitle.Header" xml:space="preserve">
<value>แสดงชื่อเพลง</value> <value>แสดงชื่อเพลง</value>
</data> </data>
<data name="SettingsPageSlide.Content" xml:space="preserve"> <data name="SettingsPageSlide.Content" xml:space="preserve">
<value>เลื่อน (Slide)</value> <value>เลื่อน (Slide)</value>
</data> </data>
<data name="SettingsPageSliderPrefix.Text" xml:space="preserve">
<value>ค่าปัจจุบัน: </value>
</data>
<data name="SettingsPageSnowFlakeLayer.Header" xml:space="preserve"> <data name="SettingsPageSnowFlakeLayer.Header" xml:space="preserve">
<value>เลเยอร์เกล็ดหิมะ</value> <value>เลเยอร์เกล็ดหิมะ</value>
</data> </data>
@@ -1485,6 +1392,9 @@
<data name="SettingsPageStartup.Text" xml:space="preserve"> <data name="SettingsPageStartup.Text" xml:space="preserve">
<value>การเริ่มระบบ</value> <value>การเริ่มระบบ</value>
</data> </data>
<data name="SettingsPageStats.Content" xml:space="preserve">
<value>สถิติ</value>
</data>
<data name="SettingsPageStopTrackOnGalleryWindowClosed.Header" xml:space="preserve"> <data name="SettingsPageStopTrackOnGalleryWindowClosed.Header" xml:space="preserve">
<value>หยุดเล่นเมื่อปิดหน้าต่างคลังเพลง</value> <value>หยุดเล่นเมื่อปิดหน้าต่างคลังเพลง</value>
</data> </data>
@@ -1503,9 +1413,6 @@
<data name="SettingsPageTaskbarPlacement.Header" xml:space="preserve"> <data name="SettingsPageTaskbarPlacement.Header" xml:space="preserve">
<value>ตำแหน่งปักหมุดแถบงาน</value> <value>ตำแหน่งปักหมุดแถบงาน</value>
</data> </data>
<data name="SettingsPageThanksForPurchasing.Text" xml:space="preserve">
<value>ขอบคุณที่ซื้อ BetterLyrics</value>
</data>
<data name="SettingsPageThanksList.Header" xml:space="preserve"> <data name="SettingsPageThanksList.Header" xml:space="preserve">
<value>รายชื่อผู้ขอบคุณ</value> <value>รายชื่อผู้ขอบคุณ</value>
</data> </data>
@@ -1524,12 +1431,6 @@
<data name="SettingsPageTitleBarAreaWhole.Content" xml:space="preserve"> <data name="SettingsPageTitleBarAreaWhole.Content" xml:space="preserve">
<value>ทั้งหน้าต่าง</value> <value>ทั้งหน้าต่าง</value>
</data> </data>
<data name="SettingsPageTitleBarType.Header" xml:space="preserve">
<value>ขนาดแถบชื่อเรื่อง</value>
</data>
<data name="SettingsPageToggleHotKey.Header" xml:space="preserve">
<value>ทางลัดเข้าและออก (Cut-in/out)</value>
</data>
<data name="SettingsPageTranslatedText.Header" xml:space="preserve"> <data name="SettingsPageTranslatedText.Header" xml:space="preserve">
<value>คำแปล</value> <value>คำแปล</value>
</data> </data>
@@ -1539,9 +1440,6 @@
<data name="SettingsPageTranslationConfig.Header" xml:space="preserve"> <data name="SettingsPageTranslationConfig.Header" xml:space="preserve">
<value>บริการแปลภาษา LibreTranslate</value> <value>บริการแปลภาษา LibreTranslate</value>
</data> </data>
<data name="SettingsPageTranslationInfoLink.Text" xml:space="preserve">
<value>ไปที่ https://github.com/LibreTranslate/LibreTranslate สำหรับบทช่วยสอนการติดตั้งและข้อมูลเพิ่มเติม (ซอฟต์แวร์นี้ไม่มีความเกี่ยวข้องกับบริการแปลดังกล่าว)</value>
</data>
<data name="SettingsPageUserWhoPurchased.Text" xml:space="preserve"> <data name="SettingsPageUserWhoPurchased.Text" xml:space="preserve">
<value>และผู้ใช้ที่ซื้อและสนับสนุน BetterLyrics</value> <value>และผู้ใช้ที่ซื้อและสนับสนุน BetterLyrics</value>
</data> </data>
@@ -1554,9 +1452,6 @@
<data name="SettingsPageWidth.Header" xml:space="preserve"> <data name="SettingsPageWidth.Header" xml:space="preserve">
<value>ความกว้าง</value> <value>ความกว้าง</value>
</data> </data>
<data name="SettingsPageWindowBounds.Header" xml:space="preserve">
<value>ขอบเขตหน้าต่าง</value>
</data>
<data name="SettingsPageWorkArea.Description" xml:space="preserve"> <data name="SettingsPageWorkArea.Description" xml:space="preserve">
<value>เป็นพื้นที่ทำงานแยกต่างหาก ยึดติดกับขอบบน/ล่างของหน้าจอ</value> <value>เป็นพื้นที่ทำงานแยกต่างหาก ยึดติดกับขอบบน/ล่างของหน้าจอ</value>
</data> </data>
@@ -1572,6 +1467,39 @@
<data name="StandardMode" xml:space="preserve"> <data name="StandardMode" xml:space="preserve">
<value>โหมดมาตรฐาน</value> <value>โหมดมาตรฐาน</value>
</data> </data>
<data name="StatsDashboardControlSources.Text" xml:space="preserve">
<value>แหล่งข้อมูล</value>
</data>
<data name="StatsDashboardControlThisMonth.Header" xml:space="preserve">
<value>เดือนนี้</value>
</data>
<data name="StatsDashboardControlThisQuarter.Header" xml:space="preserve">
<value>ไตรมาสนี้</value>
</data>
<data name="StatsDashboardControlThisWeek.Header" xml:space="preserve">
<value>สัปดาห์นี้</value>
</data>
<data name="StatsDashboardControlThisYear.Header" xml:space="preserve">
<value>ปีนี้</value>
</data>
<data name="StatsDashboardControlToday.Header" xml:space="preserve">
<value>วันนี้</value>
</data>
<data name="StatsDashboardControlTopArtists.Text" xml:space="preserve">
<value>ศิลปินชั้นนำ</value>
</data>
<data name="StatsDashboardControlTopSongs.Text" xml:space="preserve">
<value>เพลงยอดนิยม</value>
</data>
<data name="StatsDashboardControlTopSource.Text" xml:space="preserve">
<value>แหล่งข้อมูลหลัก</value>
</data>
<data name="StatsDashboardControlTotalDuration.Text" xml:space="preserve">
<value>ระยะเวลาทั้งหมด</value>
</data>
<data name="StatsDashboardControlTracksPlayed.Text" xml:space="preserve">
<value>เพลงที่เล่น</value>
</data>
<data name="SystemTrayExit.Text" xml:space="preserve"> <data name="SystemTrayExit.Text" xml:space="preserve">
<value>ออกจากโปรแกรม</value> <value>ออกจากโปรแกรม</value>
</data> </data>
@@ -1581,9 +1509,6 @@
<data name="SystemTrayMusicGallery.Text" xml:space="preserve"> <data name="SystemTrayMusicGallery.Text" xml:space="preserve">
<value>เปิดคลังเพลง</value> <value>เปิดคลังเพลง</value>
</data> </data>
<data name="SystemTrayPageTitle" xml:space="preserve">
<value>ถาดระบบ - BetterLyrics</value>
</data>
<data name="SystemTrayResetWindowPosition.Text" xml:space="preserve"> <data name="SystemTrayResetWindowPosition.Text" xml:space="preserve">
<value>รีเซ็ตตำแหน่งหน้าต่าง</value> <value>รีเซ็ตตำแหน่งหน้าต่าง</value>
</data> </data>

View File

@@ -129,21 +129,12 @@
<data name="AlbumArtSearchSMTCProvider" xml:space="preserve"> <data name="AlbumArtSearchSMTCProvider" xml:space="preserve">
<value>Trình phát nhạc</value> <value>Trình phát nhạc</value>
</data> </data>
<data name="AllLyricsSettingsControlPictureInPicture.Content" xml:space="preserve">
<value>Chế độ Hình trong hình (PiP)</value>
</data>
<data name="AppSettingsControlGeneral.Text" xml:space="preserve"> <data name="AppSettingsControlGeneral.Text" xml:space="preserve">
<value>Cửa sổ</value> <value>Cửa sổ</value>
</data> </data>
<data name="ArtistsSplitHint.Text" xml:space="preserve"> <data name="ArtistsSplitHint.Text" xml:space="preserve">
<value>Khi nhập nhiều nghệ sĩ, vui lòng sử dụng một trong các dấu phân cách sau để chia (vui lòng không trộn lẫn)</value> <value>Khi nhập nhiều nghệ sĩ, vui lòng sử dụng một trong các dấu phân cách sau để chia (vui lòng không trộn lẫn)</value>
</data> </data>
<data name="BaseWindowHostInfoBarCheckBox.Content" xml:space="preserve">
<value>Không hiển thị lại thông báo này</value>
</data>
<data name="BaseWindowMiniFlyoutItem.Text" xml:space="preserve">
<value>Chế độ Hình trong hình (PiP)</value>
</data>
<data name="Cancel" xml:space="preserve"> <data name="Cancel" xml:space="preserve">
<value>Hủy</value> <value>Hủy</value>
</data> </data>
@@ -168,24 +159,45 @@
<data name="DockedMode" xml:space="preserve"> <data name="DockedMode" xml:space="preserve">
<value>Chế độ neo (Docked)</value> <value>Chế độ neo (Docked)</value>
</data> </data>
<data name="Error" xml:space="preserve">
<value>Lỗi</value>
</data>
<data name="ExportSettingsSuccess" xml:space="preserve"> <data name="ExportSettingsSuccess" xml:space="preserve">
<value>Xuất thành công</value> <value>Xuất thành công</value>
</data> </data>
<data name="FailToStartLXMusicServer" xml:space="preserve"> <data name="FailToStartLXMusicServer" xml:space="preserve">
<value>Không thể kết nối với máy chủ LX Music, vui lòng vào Cài đặt - Nguồn phát - LX Music - Máy chủ LX Music để kiểm tra xem liên kết đã được nhập chính xác chưa</value> <value>Không thể kết nối với máy chủ LX Music, vui lòng vào Cài đặt - Nguồn phát - LX Music - Máy chủ LX Music để kiểm tra xem liên kết đã được nhập chính xác chưa</value>
</data> </data>
<data name="FileSystemServiceCleaningCache" xml:space="preserve">
<value>Đang xóa bộ nhớ đệm...</value>
</data>
<data name="FileSystemServiceConnectFailed" xml:space="preserve">
<value>Kết nối thất bại</value>
</data>
<data name="FileSystemServiceConnecting" xml:space="preserve">
<value>Đang kết nối...</value>
</data>
<data name="FileSystemServiceFetchingFileList" xml:space="preserve">
<value>Đang lấy danh sách tệp...</value>
</data>
<data name="FileSystemServiceParsing" xml:space="preserve">
<value>Đang phân tích...</value>
</data>
<data name="FileSystemServicePrepareToClean" xml:space="preserve">
<value>Đang chuẩn bị xóa bộ nhớ cache...</value>
</data>
<data name="FileSystemServiceReady" xml:space="preserve">
<value>Sẵn sàng</value>
</data>
<data name="FileSystemServiceRootDirectoryWarning" xml:space="preserve">
<value>Đường dẫn thư mục gốc đã được phát hiện. Chỉ mục đĩa đầy đủ có thể chứa một lượng lớn tệp không phải phương tiện và khiến quá trình quét mất quá nhiều thời gian. Khuyến nghị chỉ định một thư mục con cụ thể.</value>
</data>
<data name="FileSystemServiceWaitingForScan" xml:space="preserve">
<value>Đang chờ quét...</value>
</data>
<data name="FullscreenMode" xml:space="preserve"> <data name="FullscreenMode" xml:space="preserve">
<value>Chế độ toàn màn hình</value> <value>Chế độ toàn màn hình</value>
</data> </data>
<data name="HostWindowClickThroughButton.Content" xml:space="preserve">
<value>Khóa</value>
</data>
<data name="HostWindowClickThroughFlyoutItem.Text" xml:space="preserve">
<value>Khóa</value>
</data>
<data name="HostWindowLockToolTip.Text" xml:space="preserve">
<value>Khóa</value>
</data>
<data name="HostWindowMusicGalleryButtonToolTip.Content" xml:space="preserve"> <data name="HostWindowMusicGalleryButtonToolTip.Content" xml:space="preserve">
<value>Thư viện nhạc</value> <value>Thư viện nhạc</value>
</data> </data>
@@ -204,9 +216,6 @@
<data name="Jyutping" xml:space="preserve"> <data name="Jyutping" xml:space="preserve">
<value>Việt bính (Tiếng Quảng Đông)</value> <value>Việt bính (Tiếng Quảng Đông)</value>
</data> </data>
<data name="KeepAtLeastOneStatusDefault" xml:space="preserve">
<value>Vui lòng đảm bảo ít nhất một trạng thái được đặt làm mặc định</value>
</data>
<data name="LastFMAuthFailed" xml:space="preserve"> <data name="LastFMAuthFailed" xml:space="preserve">
<value>Ủy quyền thất bại, vui lòng thử lại</value> <value>Ủy quyền thất bại, vui lòng thử lại</value>
</data> </data>
@@ -270,18 +279,12 @@
<data name="LyricsPageSettings.Text" xml:space="preserve"> <data name="LyricsPageSettings.Text" xml:space="preserve">
<value>Cài đặt</value> <value>Cài đặt</value>
</data> </data>
<data name="LyricsPageTimelineOffsetButtonToolTip.Content" xml:space="preserve">
<value>Độ lệch thời gian lời bài hát</value>
</data>
<data name="LyricsPageTranslationEnabled.Description" xml:space="preserve"> <data name="LyricsPageTranslationEnabled.Description" xml:space="preserve">
<value>Sẽ ưu tiên đọc bản dịch trong lời bài hát, nếu không khớp sẽ yêu cầu dịch máy từ máy chủ LibreTranslate</value> <value>Sẽ ưu tiên đọc bản dịch trong lời bài hát, nếu không khớp sẽ yêu cầu dịch máy từ máy chủ LibreTranslate</value>
</data> </data>
<data name="LyricsPageTranslationEnabled.Header" xml:space="preserve"> <data name="LyricsPageTranslationEnabled.Header" xml:space="preserve">
<value>Bật dịch</value> <value>Bật dịch</value>
</data> </data>
<data name="LyricsPageTranslationOnly.Header" xml:space="preserve">
<value>Chỉ hiển thị bản dịch</value>
</data>
<data name="LyricsPageTranslationProviderPrefix.Header" xml:space="preserve"> <data name="LyricsPageTranslationProviderPrefix.Header" xml:space="preserve">
<value>Nhà cung cấp bản dịch</value> <value>Nhà cung cấp bản dịch</value>
</data> </data>
@@ -330,9 +333,6 @@
<data name="LyricsSearchControlSongInfoMapping.Text" xml:space="preserve"> <data name="LyricsSearchControlSongInfoMapping.Text" xml:space="preserve">
<value>Ánh xạ thông tin bài hát</value> <value>Ánh xạ thông tin bài hát</value>
</data> </data>
<data name="LyricsSearchControlTargetSearchProvider.Header" xml:space="preserve">
<value>Nhà cung cấp tìm kiếm lời bài hát mục tiêu</value>
</data>
<data name="LyricsSearchControlTitle.Header" xml:space="preserve"> <data name="LyricsSearchControlTitle.Header" xml:space="preserve">
<value>Tiêu đề</value> <value>Tiêu đề</value>
</data> </data>
@@ -351,15 +351,9 @@
<data name="LyricsSearchProviderTtmlFile" xml:space="preserve"> <data name="LyricsSearchProviderTtmlFile" xml:space="preserve">
<value>Tệp .TTML cục bộ</value> <value>Tệp .TTML cục bộ</value>
</data> </data>
<data name="LyricsWindowImmersiveButtonToolTip.Content" xml:space="preserve">
<value>Chế độ đắm chìm</value>
</data>
<data name="LyricsWindowSettingsControlLyricsWindowConfig.Text" xml:space="preserve"> <data name="LyricsWindowSettingsControlLyricsWindowConfig.Text" xml:space="preserve">
<value>Cấu hình</value> <value>Cấu hình</value>
</data> </data>
<data name="LyricsWindowSettingsControlLyricsWindowMode.Header" xml:space="preserve">
<value>Chế độ cửa sổ lời bài hát</value>
</data>
<data name="LyricsWindowSettingsControlSetDefault.Text" xml:space="preserve"> <data name="LyricsWindowSettingsControlSetDefault.Text" xml:space="preserve">
<value>Đặt làm mặc định</value> <value>Đặt làm mặc định</value>
</data> </data>
@@ -378,9 +372,6 @@
<data name="MainPageAlbumArtOnly.Content" xml:space="preserve"> <data name="MainPageAlbumArtOnly.Content" xml:space="preserve">
<value>Chỉ hiển thị vùng ảnh bìa album</value> <value>Chỉ hiển thị vùng ảnh bìa album</value>
</data> </data>
<data name="MainPageEnterImmersiveModeHint" xml:space="preserve">
<value>Di chuột lại để hiển thị nút chuyển đổi</value>
</data>
<data name="MainPageLyriscOnly.Content" xml:space="preserve"> <data name="MainPageLyriscOnly.Content" xml:space="preserve">
<value>Chỉ hiển thị lời bài hát</value> <value>Chỉ hiển thị lời bài hát</value>
</data> </data>
@@ -396,6 +387,18 @@
<data name="MainPageSplitView.Content" xml:space="preserve"> <data name="MainPageSplitView.Content" xml:space="preserve">
<value>Chế độ xem chia tách</value> <value>Chế độ xem chia tách</value>
</data> </data>
<data name="MediaSettingsControlLastSyncTime.Header" xml:space="preserve">
<value>Thời gian đồng bộ hóa gần nhất</value>
</data>
<data name="MediaSettingsControlLocalFolder" xml:space="preserve">
<value>Thư mục cục bộ</value>
</data>
<data name="MediaSettingsControlNameSetting.Header" xml:space="preserve">
<value>Tên</value>
</data>
<data name="MediaSettingsControlSyncNow.Content" xml:space="preserve">
<value>Đồng bộ hóa ngay</value>
</data>
<data name="MusicGalleryPageAddToCustomList.Text" xml:space="preserve"> <data name="MusicGalleryPageAddToCustomList.Text" xml:space="preserve">
<value>Thêm vào danh sách phát</value> <value>Thêm vào danh sách phát</value>
</data> </data>
@@ -406,11 +409,17 @@
<value>Mục tiếp theo</value> <value>Mục tiếp theo</value>
</data> </data>
<data name="MusicGalleryPageAddToPlayingQueue.Text" xml:space="preserve"> <data name="MusicGalleryPageAddToPlayingQueue.Text" xml:space="preserve">
<value>Thêm vào hàng đợi phát</value> <value>Thêm vào danh sách phát</value>
</data> </data>
<data name="MusicGalleryPageAllSongs" xml:space="preserve"> <data name="MusicGalleryPageAllSongs" xml:space="preserve">
<value>Tất cả bài hát</value> <value>Tất cả bài hát</value>
</data> </data>
<data name="MusicGalleryPageDataSync.Message" xml:space="preserve">
<value>Đang đồng bộ thư viện phương tiện...</value>
</data>
<data name="MusicGalleryPageDataSyncError.Message" xml:space="preserve">
<value>Có vấn đề với việc đồng bộ hóa Thư viện Phương tiện.</value>
</data>
<data name="MusicGalleryPageEmptyPlayingQueue.Text" xml:space="preserve"> <data name="MusicGalleryPageEmptyPlayingQueue.Text" xml:space="preserve">
<value>Xóa hàng đợi phát</value> <value>Xóa hàng đợi phát</value>
</data> </data>
@@ -420,9 +429,6 @@
<data name="MusicGalleryPageFileArtist.Header" xml:space="preserve"> <data name="MusicGalleryPageFileArtist.Header" xml:space="preserve">
<value>Nghệ sĩ</value> <value>Nghệ sĩ</value>
</data> </data>
<data name="MusicGalleryPageFileInfo.Text" xml:space="preserve">
<value>Thông tin tệp</value>
</data>
<data name="MusicGalleryPageFileInfoBitDepth.Header" xml:space="preserve"> <data name="MusicGalleryPageFileInfoBitDepth.Header" xml:space="preserve">
<value>Độ sâu bit</value> <value>Độ sâu bit</value>
</data> </data>
@@ -456,15 +462,15 @@
<data name="MusicGalleryPageFileNotFound.Text" xml:space="preserve"> <data name="MusicGalleryPageFileNotFound.Text" xml:space="preserve">
<value>Không tìm thấy bài hát nào trong thư viện phương tiện</value> <value>Không tìm thấy bài hát nào trong thư viện phương tiện</value>
</data> </data>
<data name="MusicGalleryPageFolder.Text" xml:space="preserve">
<value>Thư mục</value>
</data>
<data name="MusicGalleryPageImportFromFile.Text" xml:space="preserve"> <data name="MusicGalleryPageImportFromFile.Text" xml:space="preserve">
<value>Nhập từ tệp</value> <value>Nhập từ tệp</value>
</data> </data>
<data name="MusicGalleryPageNewPlaylist.Text" xml:space="preserve"> <data name="MusicGalleryPageNewPlaylist.Text" xml:space="preserve">
<value>Tạo danh sách phát</value> <value>Tạo danh sách phát</value>
</data> </data>
<data name="MusicGalleryPagePlayAll.Content" xml:space="preserve">
<value>Phát tất cả</value>
</data>
<data name="MusicGalleryPagePlayingQueue.Text" xml:space="preserve"> <data name="MusicGalleryPagePlayingQueue.Text" xml:space="preserve">
<value>Hàng đợi phát</value> <value>Hàng đợi phát</value>
</data> </data>
@@ -489,9 +495,6 @@
<data name="MusicGalleryPageScrollToPlayingItem.Text" xml:space="preserve"> <data name="MusicGalleryPageScrollToPlayingItem.Text" xml:space="preserve">
<value>Cuộn đến mục đang phát</value> <value>Cuộn đến mục đang phát</value>
</data> </data>
<data name="MusicGalleryPageSelectAll.Content" xml:space="preserve">
<value>Chọn tất cả</value>
</data>
<data name="MusicGalleryPageSingleLoop.Text" xml:space="preserve"> <data name="MusicGalleryPageSingleLoop.Text" xml:space="preserve">
<value>Lặp lại một bài</value> <value>Lặp lại một bài</value>
</data> </data>
@@ -513,20 +516,29 @@
<data name="MusicGalleryPageSortType.Text" xml:space="preserve"> <data name="MusicGalleryPageSortType.Text" xml:space="preserve">
<value>Loại sắp xếp</value> <value>Loại sắp xếp</value>
</data> </data>
<data name="MusicGalleryPageStarredPlaylist.Content" xml:space="preserve">
<value>Danh sách phát có gắn sao</value>
</data>
<data name="MusicGalleryPageStopTrack.Text" xml:space="preserve"> <data name="MusicGalleryPageStopTrack.Text" xml:space="preserve">
<value>Dừng</value> <value>Dừng</value>
</data> </data>
<data name="MusicGalleryPageTitle" xml:space="preserve"> <data name="MusicGalleryPageTitle" xml:space="preserve">
<value>Thư viện nhạc - BetterLyrics</value> <value>Thư viện nhạc - BetterLyrics</value>
</data> </data>
<data name="MusicGalleryWindowDownButtonToolTip.Content" xml:space="preserve"> <data name="MusicSettingsControlAutoSyncInterval.Header" xml:space="preserve">
<value>Thu hồi</value> <value>Tần suất đồng bộ tự động</value>
</data> </data>
<data name="MusicGalleryWindowUpButtonToolTip.Content" xml:space="preserve"> <data name="MusicSettingsControlAutoSyncIntervalDisabled.Content" xml:space="preserve">
<value>Mở rộng</value> <value>Không bao giờ</value>
</data>
<data name="MusicSettingsControlAutoSyncIntervalEveryDay.Content" xml:space="preserve">
<value>Hàng ngày</value>
</data>
<data name="MusicSettingsControlAutoSyncIntervalEveryFifteenMin.Content" xml:space="preserve">
<value>15 phút một lần</value>
</data>
<data name="MusicSettingsControlAutoSyncIntervalEveryHour.Content" xml:space="preserve">
<value>Mỗi giờ</value>
</data>
<data name="MusicSettingsControlAutoSyncIntervalEverySixHrs.Content" xml:space="preserve">
<value>Mỗi 6 tiếng</value>
</data> </data>
<data name="NarrowMode" xml:space="preserve"> <data name="NarrowMode" xml:space="preserve">
<value>Chế độ hẹp</value> <value>Chế độ hẹp</value>
@@ -543,12 +555,27 @@
<data name="PrivacyPolicy.Content" xml:space="preserve"> <data name="PrivacyPolicy.Content" xml:space="preserve">
<value>Chính sách bảo mật</value> <value>Chính sách bảo mật</value>
</data> </data>
<data name="RemoteServerConfigControlBrowse.Content" xml:space="preserve">
<value>Duyệt</value>
</data>
<data name="RemoteServerConfigControlName.Header" xml:space="preserve">
<value>Tên</value>
</data>
<data name="RemoteServerConfigControlName.PlaceholderText" xml:space="preserve">
<value>Nếu để trống, hệ thống sẽ tự động tạo tên mặc định.</value>
</data>
<data name="RemoteServerConfigControlPassword.Header" xml:space="preserve"> <data name="RemoteServerConfigControlPassword.Header" xml:space="preserve">
<value>Mật khẩu</value> <value>Mật khẩu</value>
</data> </data>
<data name="RemoteServerConfigControlPath.Header" xml:space="preserve"> <data name="RemoteServerConfigControlPath.Header" xml:space="preserve">
<value>Đường dẫn</value> <value>Đường dẫn</value>
</data> </data>
<data name="RemoteServerConfigControlPathNotExisted" xml:space="preserve">
<value>Đường dẫn thư mục đã chỉ định không thể tìm thấy.</value>
</data>
<data name="RemoteServerConfigControlPathRequired" xml:space="preserve">
<value>Đường dẫn là bắt buộc.</value>
</data>
<data name="RemoteServerConfigControlPort.Header" xml:space="preserve"> <data name="RemoteServerConfigControlPort.Header" xml:space="preserve">
<value>Cổng</value> <value>Cổng</value>
</data> </data>
@@ -576,9 +603,6 @@
<data name="SetingsPageFeedback.Text" xml:space="preserve"> <data name="SetingsPageFeedback.Text" xml:space="preserve">
<value>Phản hồi</value> <value>Phản hồi</value>
</data> </data>
<data name="SetingsPageInstructions.Text" xml:space="preserve">
<value>Hướng dẫn sử dụng</value>
</data>
<data name="SetingsPageSpecialThanks.Text" xml:space="preserve"> <data name="SetingsPageSpecialThanks.Text" xml:space="preserve">
<value>Lời cảm ơn đặc biệt</value> <value>Lời cảm ơn đặc biệt</value>
</data> </data>
@@ -606,9 +630,6 @@
<data name="SettingsPageAddFolderButton.Content" xml:space="preserve"> <data name="SettingsPageAddFolderButton.Content" xml:space="preserve">
<value>Thêm</value> <value>Thêm</value>
</data> </data>
<data name="SettingsPageAdvanced.Text" xml:space="preserve">
<value>Tùy chọn nâng cao</value>
</data>
<data name="SettingsPageAlbum.Header" xml:space="preserve"> <data name="SettingsPageAlbum.Header" xml:space="preserve">
<value>Album</value> <value>Album</value>
</data> </data>
@@ -624,15 +645,9 @@
<data name="SettingsPageAlbumArtSearchProvidersConfig.Text" xml:space="preserve"> <data name="SettingsPageAlbumArtSearchProvidersConfig.Text" xml:space="preserve">
<value>Cấu hình nguồn ảnh bìa album</value> <value>Cấu hình nguồn ảnh bìa album</value>
</data> </data>
<data name="SettingsPageAlbumArtSize.Header" xml:space="preserve">
<value>Kích thước ảnh bìa album</value>
</data>
<data name="SettingsPageAlbumEffect.Text" xml:space="preserve"> <data name="SettingsPageAlbumEffect.Text" xml:space="preserve">
<value>Hiệu ứng ảnh bìa album</value> <value>Hiệu ứng ảnh bìa album</value>
</data> </data>
<data name="SettingsPageAlbumLib.Content" xml:space="preserve">
<value>Nguồn ảnh bìa album</value>
</data>
<data name="SettingsPageAlbumRadius.Header" xml:space="preserve"> <data name="SettingsPageAlbumRadius.Header" xml:space="preserve">
<value>Bán kính góc</value> <value>Bán kính góc</value>
</data> </data>
@@ -663,12 +678,6 @@
<data name="SettingsPageAppAppearance.Text" xml:space="preserve"> <data name="SettingsPageAppAppearance.Text" xml:space="preserve">
<value>Giao diện ứng dụng</value> <value>Giao diện ứng dụng</value>
</data> </data>
<data name="SettingsPageAppBehavior.Text" xml:space="preserve">
<value>Hành vi chung</value>
</data>
<data name="SettingsPageApply.Content" xml:space="preserve">
<value>Áp dụng</value>
</data>
<data name="SettingsPageArtist.Header" xml:space="preserve"> <data name="SettingsPageArtist.Header" xml:space="preserve">
<value>Nghệ sĩ</value> <value>Nghệ sĩ</value>
</data> </data>
@@ -687,23 +696,14 @@
<data name="SettingsPageAutoStart.Header" xml:space="preserve"> <data name="SettingsPageAutoStart.Header" xml:space="preserve">
<value>Tự động khởi động</value> <value>Tự động khởi động</value>
</data> </data>
<data name="SettingsPageAutoStartWindow.Header" xml:space="preserve">
<value>Khi khởi động ứng dụng</value>
</data>
<data name="SettingsPageBackdrop.Header" xml:space="preserve">
<value>Chất liệu nền lời bài hát</value>
</data>
<data name="SettingsPageBackgroundOverlay.Text" xml:space="preserve"> <data name="SettingsPageBackgroundOverlay.Text" xml:space="preserve">
<value>Nền lời bài hát</value> <value>Nền lời bài hát</value>
</data> </data>
<data name="SettingsPageBlurAmount.Header" xml:space="preserve"> <data name="SettingsPageBlurAmount.Header" xml:space="preserve">
<value>Độ mờ</value> <value>Độ mờ</value>
</data> </data>
<data name="SettingsPageBorderless.Header" xml:space="preserve">
<value>Cửa sổ không viền</value>
</data>
<data name="SettingsPageCache.Description" xml:space="preserve"> <data name="SettingsPageCache.Description" xml:space="preserve">
<value>Bao gồm tệp nhật ký, bộ nhớ đệm lời bài hát mạng</value> <value>Gồm các tệp nhật ký bộ nhớ đệm lời bài hát trực tuyến.</value>
</data> </data>
<data name="SettingsPageCache.Header" xml:space="preserve"> <data name="SettingsPageCache.Header" xml:space="preserve">
<value>Bộ nhớ đệm</value> <value>Bộ nhớ đệm</value>
@@ -738,9 +738,6 @@
<data name="SettingsPageCollapseDropdown.Content" xml:space="preserve"> <data name="SettingsPageCollapseDropdown.Content" xml:space="preserve">
<value>Thu gọn danh sách thả xuống</value> <value>Thu gọn danh sách thả xuống</value>
</data> </data>
<data name="SettingsPageCompactTitleBar.Content" xml:space="preserve">
<value>Nhỏ gọn</value>
</data>
<data name="SettingsPageConfigName.Description" xml:space="preserve"> <data name="SettingsPageConfigName.Description" xml:space="preserve">
<value>Đặt tên cho trạng thái cửa sổ đã ghi lại có thể giúp bạn phân biệt chúng tốt hơn</value> <value>Đặt tên cho trạng thái cửa sổ đã ghi lại có thể giúp bạn phân biệt chúng tốt hơn</value>
</data> </data>
@@ -759,18 +756,12 @@
<data name="SettingsPageCrossfade.Content" xml:space="preserve"> <data name="SettingsPageCrossfade.Content" xml:space="preserve">
<value>Chuyển tiếp mờ dần (Crossfade)</value> <value>Chuyển tiếp mờ dần (Crossfade)</value>
</data> </data>
<data name="SettingsPageCurrentLyricsWindowStatus.Text" xml:space="preserve">
<value>Trạng thái cửa sổ lời bài hát hiện tại</value>
</data>
<data name="SettingsPageCutletDockerServer.Header" xml:space="preserve"> <data name="SettingsPageCutletDockerServer.Header" xml:space="preserve">
<value>Dịch vụ phiên âm cutlet-docker</value> <value>Dịch vụ phiên âm cutlet-docker</value>
</data> </data>
<data name="SettingsPageDark.Content" xml:space="preserve"> <data name="SettingsPageDark.Content" xml:space="preserve">
<value>Tối</value> <value>Tối</value>
</data> </data>
<data name="SettingsPageDebugOverlay.Header" xml:space="preserve">
<value>Hiển thị lớp phủ gỡ lỗi</value>
</data>
<data name="SettingsPageDelete.Text" xml:space="preserve"> <data name="SettingsPageDelete.Text" xml:space="preserve">
<value>Xóa</value> <value>Xóa</value>
</data> </data>
@@ -801,15 +792,9 @@
<data name="SettingsPageDockPlacementTop.Content" xml:space="preserve"> <data name="SettingsPageDockPlacementTop.Content" xml:space="preserve">
<value>Trên cùng</value> <value>Trên cùng</value>
</data> </data>
<data name="SettingsPageDockWindowHeight.Header" xml:space="preserve">
<value>Chiều cao cửa sổ</value>
</data>
<data name="SettingsPageDragArea.Header" xml:space="preserve"> <data name="SettingsPageDragArea.Header" xml:space="preserve">
<value>Vùng có thể kéo</value> <value>Vùng có thể kéo</value>
</data> </data>
<data name="SettingsPageEasingFuncType.Header" xml:space="preserve">
<value>Loại hoạt ảnh nới lỏng (Easing)</value>
</data>
<data name="SettingsPageEasingTypeEaseInOutBack.Content" xml:space="preserve"> <data name="SettingsPageEasingTypeEaseInOutBack.Content" xml:space="preserve">
<value>EaseInOutBack</value> <value>EaseInOutBack</value>
</data> </data>
@@ -873,18 +858,15 @@
<data name="SettingsPageExitOnLyricsWindowClosed.Header" xml:space="preserve"> <data name="SettingsPageExitOnLyricsWindowClosed.Header" xml:space="preserve">
<value>Thoát chương trình khi đóng cửa sổ lời bài hát</value> <value>Thoát chương trình khi đóng cửa sổ lời bài hát</value>
</data> </data>
<data name="SettingsPageExportPlayHistoryButton.Content" xml:space="preserve">
<value>Xuất lịch sử phát lại</value>
</data>
<data name="SettingsPageExportSettingsButton.Content" xml:space="preserve"> <data name="SettingsPageExportSettingsButton.Content" xml:space="preserve">
<value>Xuất cài đặt</value> <value>Xuất cài đặt</value>
</data> </data>
<data name="SettingsPageExtendedTitleBar.Content" xml:space="preserve">
<value>Mở rộng</value>
</data>
<data name="SettingsPageFan.Header" xml:space="preserve"> <data name="SettingsPageFan.Header" xml:space="preserve">
<value>Lời bài hát dạng quạt</value> <value>Lời bài hát dạng quạt</value>
</data> </data>
<data name="SettingsPageFAQ.Content" xml:space="preserve">
<value>Câu hỏi thường gặp</value>
</data>
<data name="SettingsPageFixedTimeStep.Header" xml:space="preserve"> <data name="SettingsPageFixedTimeStep.Header" xml:space="preserve">
<value>Kết xuất bước thời gian cố định</value> <value>Kết xuất bước thời gian cố định</value>
</data> </data>
@@ -921,9 +903,6 @@
<data name="SettingsPageHeight.Header" xml:space="preserve"> <data name="SettingsPageHeight.Header" xml:space="preserve">
<value>Chiều cao</value> <value>Chiều cao</value>
</data> </data>
<data name="SettingsPageHello.Text" xml:space="preserve">
<value>Xin chào</value>
</data>
<data name="SettingsPageHelpUsTranslate.Content" xml:space="preserve"> <data name="SettingsPageHelpUsTranslate.Content" xml:space="preserve">
<value>Giúp chúng tôi dịch ứng dụng này</value> <value>Giúp chúng tôi dịch ứng dụng này</value>
</data> </data>
@@ -954,9 +933,6 @@
<data name="SettingsPageJapanese.Header" xml:space="preserve"> <data name="SettingsPageJapanese.Header" xml:space="preserve">
<value>Phiên âm tiếng Nhật</value> <value>Phiên âm tiếng Nhật</value>
</data> </data>
<data name="SettingsPageJoinNowButton.Content" xml:space="preserve">
<value>Tham gia ngay</value>
</data>
<data name="SettingsPageJyutping.Content" xml:space="preserve"> <data name="SettingsPageJyutping.Content" xml:space="preserve">
<value>Việt bính (Tiếng Quảng Đông)</value> <value>Việt bính (Tiếng Quảng Đông)</value>
</data> </data>
@@ -1005,18 +981,12 @@
<data name="SettingsPageLight.Content" xml:space="preserve"> <data name="SettingsPageLight.Content" xml:space="preserve">
<value>Sáng</value> <value>Sáng</value>
</data> </data>
<data name="SettingsPageLinkedFile.Text" xml:space="preserve">
<value>Tệp cục bộ được liên kết</value>
</data>
<data name="SettingsPageListenNewSession.Header" xml:space="preserve"> <data name="SettingsPageListenNewSession.Header" xml:space="preserve">
<value>Bật lắng nghe nguồn phát mới</value> <value>Bật lắng nghe nguồn phát mới</value>
</data> </data>
<data name="SettingsPageLocalFolder.Text" xml:space="preserve"> <data name="SettingsPageLocalFolder.Text" xml:space="preserve">
<value>Thư mục cục bộ</value> <value>Thư mục cục bộ</value>
</data> </data>
<data name="SettingsPageLog.Header" xml:space="preserve">
<value>Nhật ký (Log)</value>
</data>
<data name="SettingsPageLongSyllableDuration.Header" xml:space="preserve"> <data name="SettingsPageLongSyllableDuration.Header" xml:space="preserve">
<value>Ngưỡng âm tiết dài</value> <value>Ngưỡng âm tiết dài</value>
</data> </data>
@@ -1071,15 +1041,6 @@
<data name="SettingsPageLyricsFgFontColor.Header" xml:space="preserve"> <data name="SettingsPageLyricsFgFontColor.Header" xml:space="preserve">
<value>Dòng hiện tại</value> <value>Dòng hiện tại</value>
</data> </data>
<data name="SettingsPageLyricsFgFontColorAdaptiveColored.Content" xml:space="preserve">
<value>Thích ứng nền lời bài hát (Có màu)</value>
</data>
<data name="SettingsPageLyricsFgFontColorAdaptiveGrayed.Content" xml:space="preserve">
<value>Thích ứng nền lời bài hát (Xám)</value>
</data>
<data name="SettingsPageLyricsFgFontColorCustom.Content" xml:space="preserve">
<value>Tùy chỉnh</value>
</data>
<data name="SettingsPageLyricsFloatAnimation.Header" xml:space="preserve"> <data name="SettingsPageLyricsFloatAnimation.Header" xml:space="preserve">
<value>Hoạt ảnh nổi</value> <value>Hoạt ảnh nổi</value>
</data> </data>
@@ -1107,27 +1068,12 @@
<data name="SettingsPageLyricsGlowEffect.Header" xml:space="preserve"> <data name="SettingsPageLyricsGlowEffect.Header" xml:space="preserve">
<value>Hiệu ứng phát sáng</value> <value>Hiệu ứng phát sáng</value>
</data> </data>
<data name="SettingsPageLyricsHighlight.Header" xml:space="preserve">
<value>Nổi bật</value>
</data>
<data name="SettingsPageLyricsHighlightScope.Header" xml:space="preserve">
<value>Phạm vi nổi bật văn bản gốc</value>
</data>
<data name="SettingsPageLyricsLeft.Content" xml:space="preserve">
<value>Trái</value>
</data>
<data name="SettingsPageLyricsLight.Content" xml:space="preserve"> <data name="SettingsPageLyricsLight.Content" xml:space="preserve">
<value>Mảnh</value> <value>Mảnh</value>
</data> </data>
<data name="SettingsPageLyricsLineFade.Header" xml:space="preserve">
<value>Độ mờ cạnh vùng phát</value>
</data>
<data name="SettingsPageLyricsLineSpacingFactor.Header" xml:space="preserve"> <data name="SettingsPageLyricsLineSpacingFactor.Header" xml:space="preserve">
<value>Khoảng cách dòng</value> <value>Khoảng cách dòng</value>
</data> </data>
<data name="SettingsPageLyricsLineSpacingFactorUnit.Text" xml:space="preserve">
<value> lần chiều cao dòng</value>
</data>
<data name="SettingsPageLyricsMedium.Content" xml:space="preserve"> <data name="SettingsPageLyricsMedium.Content" xml:space="preserve">
<value>Trung bình</value> <value>Trung bình</value>
</data> </data>
@@ -1170,9 +1116,6 @@
<data name="SettingsPageLyricsSemiLight.Content" xml:space="preserve"> <data name="SettingsPageLyricsSemiLight.Content" xml:space="preserve">
<value>Bán mảnh</value> <value>Bán mảnh</value>
</data> </data>
<data name="SettingsPageLyricsShadow.Header" xml:space="preserve">
<value>Bóng</value>
</data>
<data name="SettingsPageLyricsStyle.Text" xml:space="preserve"> <data name="SettingsPageLyricsStyle.Text" xml:space="preserve">
<value>Kiểu lời bài hát</value> <value>Kiểu lời bài hát</value>
</data> </data>
@@ -1188,30 +1131,15 @@
<data name="SettingsPageLyricsTimelineThreshold.Header" xml:space="preserve"> <data name="SettingsPageLyricsTimelineThreshold.Header" xml:space="preserve">
<value>Ngưỡng đồng bộ hóa dòng thời gian lời bài hát</value> <value>Ngưỡng đồng bộ hóa dòng thời gian lời bài hát</value>
</data> </data>
<data name="SettingsPageLyricsTranslationHighlight.Header" xml:space="preserve">
<value>Nổi bật bản dịch</value>
</data>
<data name="SettingsPageLyricsTranslationSeparator.Header" xml:space="preserve">
<value>Dấu phân cách bản gốc và bản dịch</value>
</data>
<data name="SettingsPageLyricsVerticalEdgeOpacity.Header" xml:space="preserve">
<value>Độ mờ cạnh dọc</value>
</data>
<data name="SettingsPageLyricsWindow.Text" xml:space="preserve"> <data name="SettingsPageLyricsWindow.Text" xml:space="preserve">
<value>Cửa sổ lời bài hát</value> <value>Cửa sổ lời bài hát</value>
</data> </data>
<data name="SettingsPageLyricsWindowManager.Text" xml:space="preserve">
<value>Trình quản lý cửa sổ lời bài hát</value>
</data>
<data name="SettingsPageLyricsWindowMgr.Content" xml:space="preserve"> <data name="SettingsPageLyricsWindowMgr.Content" xml:space="preserve">
<value>Trình quản lý cửa sổ lời bài hát</value> <value>Trình quản lý cửa sổ lời bài hát</value>
</data> </data>
<data name="SettingsPageLyricsWindowSwitchHotKey.Header" xml:space="preserve"> <data name="SettingsPageLyricsWindowSwitchHotKey.Header" xml:space="preserve">
<value>Phím tắt chuyển trạng thái cửa sổ lời bài hát</value> <value>Phím tắt chuyển trạng thái cửa sổ lời bài hát</value>
</data> </data>
<data name="SettingsPageLyricsWindowToolTip.Content" xml:space="preserve">
<value>Cửa sổ lời bài hát</value>
</data>
<data name="SettingsPageMatchingThreshold.Description" xml:space="preserve"> <data name="SettingsPageMatchingThreshold.Description" xml:space="preserve">
<value>Điều chỉnh giá trị này sẽ ảnh hưởng đến kết quả tìm kiếm tuần tự và khớp nhất, nhưng sẽ không ảnh hưởng đến kết quả tìm kiếm trong giao diện tìm kiếm lời bài hát thủ công</value> <value>Điều chỉnh giá trị này sẽ ảnh hưởng đến kết quả tìm kiếm tuần tự và khớp nhất, nhưng sẽ không ảnh hưởng đến kết quả tìm kiếm trong giao diện tìm kiếm lời bài hát thủ công</value>
</data> </data>
@@ -1248,18 +1176,12 @@
<data name="SettingsPageMusicLib.Header" xml:space="preserve"> <data name="SettingsPageMusicLib.Header" xml:space="preserve">
<value>Thư viện phương tiện cục bộ</value> <value>Thư viện phương tiện cục bộ</value>
</data> </data>
<data name="SettingsPageMusicLibRealTimeWatch.Header" xml:space="preserve">
<value>Lắng nghe thay đổi tệp thời gian thực</value>
</data>
<data name="SettingsPageNarrowMode.Text" xml:space="preserve"> <data name="SettingsPageNarrowMode.Text" xml:space="preserve">
<value>Chế độ hẹp</value> <value>Chế độ hẹp</value>
</data> </data>
<data name="SettingsPageNextSongHotKey.Header" xml:space="preserve"> <data name="SettingsPageNextSongHotKey.Header" xml:space="preserve">
<value>Phím tắt bài hát tiếp theo</value> <value>Phím tắt bài hát tiếp theo</value>
</data> </data>
<data name="SettingsPageNoBackdrop.Content" xml:space="preserve">
<value>Không</value>
</data>
<data name="SettingsPageOctTree.Content" xml:space="preserve"> <data name="SettingsPageOctTree.Content" xml:space="preserve">
<value>Mạnh mẽ</value> <value>Mạnh mẽ</value>
</data> </data>
@@ -1287,9 +1209,6 @@
<data name="SettingsPagePathIncludingOthersInfo" xml:space="preserve"> <data name="SettingsPagePathIncludingOthersInfo" xml:space="preserve">
<value>Thư mục này bao gồm các thư mục đã thêm, vui lòng xóa các thư mục đó để thêm thư mục này</value> <value>Thư mục này bao gồm các thư mục đã thêm, vui lòng xóa các thư mục đó để thêm thư mục này</value>
</data> </data>
<data name="SettingsPagePathNotFound.Text" xml:space="preserve">
<value>Không thể tìm thấy đường dẫn trên máy tính của bạn</value>
</data>
<data name="SettingsPagePatrons.Text" xml:space="preserve"> <data name="SettingsPagePatrons.Text" xml:space="preserve">
<value>Nhà tài trợ</value> <value>Nhà tài trợ</value>
</data> </data>
@@ -1335,15 +1254,9 @@
<data name="SettingsPageRealtimeStatus.Text" xml:space="preserve"> <data name="SettingsPageRealtimeStatus.Text" xml:space="preserve">
<value>Trạng thái thời gian thực</value> <value>Trạng thái thời gian thực</value>
</data> </data>
<data name="SettingsPageRecord.Content" xml:space="preserve">
<value>Ghi lại</value>
</data>
<data name="SettingsPageRecordedWindowStatus.Text" xml:space="preserve"> <data name="SettingsPageRecordedWindowStatus.Text" xml:space="preserve">
<value>Trạng thái cửa sổ đã ghi lại</value> <value>Trạng thái cửa sổ đã ghi lại</value>
</data> </data>
<data name="SettingsPageReference.Header" xml:space="preserve">
<value>Liên kết tham khảo</value>
</data>
<data name="SettingsPageRefreshDropdown.Content" xml:space="preserve"> <data name="SettingsPageRefreshDropdown.Content" xml:space="preserve">
<value>Làm mới danh sách thả xuống</value> <value>Làm mới danh sách thả xuống</value>
</data> </data>
@@ -1362,9 +1275,6 @@
<data name="SettingsPageRight.Content" xml:space="preserve"> <data name="SettingsPageRight.Content" xml:space="preserve">
<value>Phải</value> <value>Phải</value>
</data> </data>
<data name="SettingsPageRomaji.Header" xml:space="preserve">
<value>Phiên âm tiếng Nhật</value>
</data>
<data name="SettingsPageScope.Header" xml:space="preserve"> <data name="SettingsPageScope.Header" xml:space="preserve">
<value>Phạm vi</value> <value>Phạm vi</value>
</data> </data>
@@ -1404,6 +1314,9 @@
<data name="SettingsPageSettingsManager.Header" xml:space="preserve"> <data name="SettingsPageSettingsManager.Header" xml:space="preserve">
<value>Trình quản lý cài đặt</value> <value>Trình quản lý cài đặt</value>
</data> </data>
<data name="SettingsPageSettingsPlayHistory.Header" xml:space="preserve">
<value>Lịch sử chơi</value>
</data>
<data name="SettingsPageShareHub.Content" xml:space="preserve"> <data name="SettingsPageShareHub.Content" xml:space="preserve">
<value>Duyệt trung tâm chia sẻ tài nguyên trực tuyến</value> <value>Duyệt trung tâm chia sẻ tài nguyên trực tuyến</value>
</data> </data>
@@ -1431,18 +1344,12 @@
<data name="SettingsPageShowInSwitchers.Header" xml:space="preserve"> <data name="SettingsPageShowInSwitchers.Header" xml:space="preserve">
<value>Hiển thị trong môi trường hệ thống</value> <value>Hiển thị trong môi trường hệ thống</value>
</data> </data>
<data name="SettingsPageShowLayoutDragger.Header" xml:space="preserve">
<value>Hiển thị bộ chia bố cục</value>
</data>
<data name="SettingsPageShowTitle.Header" xml:space="preserve"> <data name="SettingsPageShowTitle.Header" xml:space="preserve">
<value>Hiển thị tiêu đề</value> <value>Hiển thị tiêu đề</value>
</data> </data>
<data name="SettingsPageSlide.Content" xml:space="preserve"> <data name="SettingsPageSlide.Content" xml:space="preserve">
<value>Trượt</value> <value>Trượt</value>
</data> </data>
<data name="SettingsPageSliderPrefix.Text" xml:space="preserve">
<value>Giá trị hiện tại: </value>
</data>
<data name="SettingsPageSnowFlakeLayer.Header" xml:space="preserve"> <data name="SettingsPageSnowFlakeLayer.Header" xml:space="preserve">
<value>Lớp bông tuyết</value> <value>Lớp bông tuyết</value>
</data> </data>
@@ -1485,6 +1392,9 @@
<data name="SettingsPageStartup.Text" xml:space="preserve"> <data name="SettingsPageStartup.Text" xml:space="preserve">
<value>Khởi động</value> <value>Khởi động</value>
</data> </data>
<data name="SettingsPageStats.Content" xml:space="preserve">
<value>Thống kê</value>
</data>
<data name="SettingsPageStopTrackOnGalleryWindowClosed.Header" xml:space="preserve"> <data name="SettingsPageStopTrackOnGalleryWindowClosed.Header" xml:space="preserve">
<value>Dừng phát khi đóng cửa sổ thư viện nhạc</value> <value>Dừng phát khi đóng cửa sổ thư viện nhạc</value>
</data> </data>
@@ -1503,9 +1413,6 @@
<data name="SettingsPageTaskbarPlacement.Header" xml:space="preserve"> <data name="SettingsPageTaskbarPlacement.Header" xml:space="preserve">
<value>Vị trí cố định thanh tác vụ</value> <value>Vị trí cố định thanh tác vụ</value>
</data> </data>
<data name="SettingsPageThanksForPurchasing.Text" xml:space="preserve">
<value>Cảm ơn bạn đã mua BetterLyrics</value>
</data>
<data name="SettingsPageThanksList.Header" xml:space="preserve"> <data name="SettingsPageThanksList.Header" xml:space="preserve">
<value>Danh sách cảm ơn</value> <value>Danh sách cảm ơn</value>
</data> </data>
@@ -1524,12 +1431,6 @@
<data name="SettingsPageTitleBarAreaWhole.Content" xml:space="preserve"> <data name="SettingsPageTitleBarAreaWhole.Content" xml:space="preserve">
<value>Toàn bộ cửa sổ</value> <value>Toàn bộ cửa sổ</value>
</data> </data>
<data name="SettingsPageTitleBarType.Header" xml:space="preserve">
<value>Kích thước thanh tiêu đề</value>
</data>
<data name="SettingsPageToggleHotKey.Header" xml:space="preserve">
<value>Phím tắt chuyển nhập và xuất (Cut-in/out)</value>
</data>
<data name="SettingsPageTranslatedText.Header" xml:space="preserve"> <data name="SettingsPageTranslatedText.Header" xml:space="preserve">
<value>Bản dịch</value> <value>Bản dịch</value>
</data> </data>
@@ -1539,9 +1440,6 @@
<data name="SettingsPageTranslationConfig.Header" xml:space="preserve"> <data name="SettingsPageTranslationConfig.Header" xml:space="preserve">
<value>Dịch vụ dịch thuật LibreTranslate</value> <value>Dịch vụ dịch thuật LibreTranslate</value>
</data> </data>
<data name="SettingsPageTranslationInfoLink.Text" xml:space="preserve">
<value>Truy cập https://github.com/LibreTranslate/LibreTranslate để biết hướng dẫn cài đặt và thêm thông tin (phần mềm này không liên quan gì đến dịch vụ dịch thuật đó)</value>
</data>
<data name="SettingsPageUserWhoPurchased.Text" xml:space="preserve"> <data name="SettingsPageUserWhoPurchased.Text" xml:space="preserve">
<value>và những người dùng đã mua và ủng hộ BetterLyrics</value> <value>và những người dùng đã mua và ủng hộ BetterLyrics</value>
</data> </data>
@@ -1554,9 +1452,6 @@
<data name="SettingsPageWidth.Header" xml:space="preserve"> <data name="SettingsPageWidth.Header" xml:space="preserve">
<value>Chiều rộng</value> <value>Chiều rộng</value>
</data> </data>
<data name="SettingsPageWindowBounds.Header" xml:space="preserve">
<value>Biên cửa sổ</value>
</data>
<data name="SettingsPageWorkArea.Description" xml:space="preserve"> <data name="SettingsPageWorkArea.Description" xml:space="preserve">
<value>Là một không gian làm việc riêng biệt, được gắn vào cạnh trên/dưới của màn hình</value> <value>Là một không gian làm việc riêng biệt, được gắn vào cạnh trên/dưới của màn hình</value>
</data> </data>
@@ -1572,6 +1467,39 @@
<data name="StandardMode" xml:space="preserve"> <data name="StandardMode" xml:space="preserve">
<value>Chế độ tiêu chuẩn</value> <value>Chế độ tiêu chuẩn</value>
</data> </data>
<data name="StatsDashboardControlSources.Text" xml:space="preserve">
<value>Nguồn</value>
</data>
<data name="StatsDashboardControlThisMonth.Header" xml:space="preserve">
<value>Tháng này</value>
</data>
<data name="StatsDashboardControlThisQuarter.Header" xml:space="preserve">
<value>Quý này</value>
</data>
<data name="StatsDashboardControlThisWeek.Header" xml:space="preserve">
<value>Tuần này</value>
</data>
<data name="StatsDashboardControlThisYear.Header" xml:space="preserve">
<value>Năm nay</value>
</data>
<data name="StatsDashboardControlToday.Header" xml:space="preserve">
<value>Hôm nay</value>
</data>
<data name="StatsDashboardControlTopArtists.Text" xml:space="preserve">
<value>Những nghệ sĩ hàng đầu</value>
</data>
<data name="StatsDashboardControlTopSongs.Text" xml:space="preserve">
<value>Các bài hát hàng đầu</value>
</data>
<data name="StatsDashboardControlTopSource.Text" xml:space="preserve">
<value>Nguồn hàng đầu</value>
</data>
<data name="StatsDashboardControlTotalDuration.Text" xml:space="preserve">
<value>Thời gian tổng cộng</value>
</data>
<data name="StatsDashboardControlTracksPlayed.Text" xml:space="preserve">
<value>Các bài hát đã phát</value>
</data>
<data name="SystemTrayExit.Text" xml:space="preserve"> <data name="SystemTrayExit.Text" xml:space="preserve">
<value>Thoát chương trình</value> <value>Thoát chương trình</value>
</data> </data>
@@ -1581,9 +1509,6 @@
<data name="SystemTrayMusicGallery.Text" xml:space="preserve"> <data name="SystemTrayMusicGallery.Text" xml:space="preserve">
<value>Mở thư viện nhạc</value> <value>Mở thư viện nhạc</value>
</data> </data>
<data name="SystemTrayPageTitle" xml:space="preserve">
<value>Khay hệ thống - BetterLyrics</value>
</data>
<data name="SystemTrayResetWindowPosition.Text" xml:space="preserve"> <data name="SystemTrayResetWindowPosition.Text" xml:space="preserve">
<value>Đặt lại vị trí cửa sổ</value> <value>Đặt lại vị trí cửa sổ</value>
</data> </data>

View File

@@ -59,46 +59,46 @@
: using a System.ComponentModel.TypeConverter : using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding. : and then encoded with base64 encoding.
--> -->
<xsd:schema xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata" id="root"> <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace"/> <xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:element name="root" msdata:IsDataSet="true"> <xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType> <xsd:complexType>
<xsd:choice maxOccurs="unbounded"> <xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata"> <xsd:element name="metadata">
<xsd:complexType> <xsd:complexType>
<xsd:sequence> <xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0"/> <xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence> </xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string"/> <xsd:attribute name="name" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string"/> <xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string"/> <xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space"/> <xsd:attribute ref="xml:space" />
</xsd:complexType> </xsd:complexType>
</xsd:element> </xsd:element>
<xsd:element name="assembly"> <xsd:element name="assembly">
<xsd:complexType> <xsd:complexType>
<xsd:attribute name="alias" type="xsd:string"/> <xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string"/> <xsd:attribute name="name" type="xsd:string" />
</xsd:complexType> </xsd:complexType>
</xsd:element> </xsd:element>
<xsd:element name="data"> <xsd:element name="data">
<xsd:complexType> <xsd:complexType>
<xsd:sequence> <xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1"/> <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2"/> <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence> </xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1"/> <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3"/> <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4"/> <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space"/> <xsd:attribute ref="xml:space" />
</xsd:complexType> </xsd:complexType>
</xsd:element> </xsd:element>
<xsd:element name="resheader"> <xsd:element name="resheader">
<xsd:complexType> <xsd:complexType>
<xsd:sequence> <xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1"/> <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence> </xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required"/> <xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType> </xsd:complexType>
</xsd:element> </xsd:element>
</xsd:choice> </xsd:choice>
@@ -129,21 +129,12 @@
<data name="AlbumArtSearchSMTCProvider" xml:space="preserve"> <data name="AlbumArtSearchSMTCProvider" xml:space="preserve">
<value>音乐播放器</value> <value>音乐播放器</value>
</data> </data>
<data name="AllLyricsSettingsControlPictureInPicture.Content" xml:space="preserve">
<value>画中画模式</value>
</data>
<data name="AppSettingsControlGeneral.Text" xml:space="preserve"> <data name="AppSettingsControlGeneral.Text" xml:space="preserve">
<value>窗口</value> <value>窗口</value>
</data> </data>
<data name="ArtistsSplitHint.Text" xml:space="preserve"> <data name="ArtistsSplitHint.Text" xml:space="preserve">
<value>输入多位艺术家时,请使用以下分隔符之一进行分隔(请勿混合使用)</value> <value>输入多位艺术家时,请使用以下分隔符之一进行分隔(请勿混合使用)</value>
</data> </data>
<data name="BaseWindowHostInfoBarCheckBox.Content" xml:space="preserve">
<value>不再显示此消息</value>
</data>
<data name="BaseWindowMiniFlyoutItem.Text" xml:space="preserve">
<value>画中画模式</value>
</data>
<data name="Cancel" xml:space="preserve"> <data name="Cancel" xml:space="preserve">
<value>取消</value> <value>取消</value>
</data> </data>
@@ -168,24 +159,45 @@
<data name="DockedMode" xml:space="preserve"> <data name="DockedMode" xml:space="preserve">
<value>停靠模式</value> <value>停靠模式</value>
</data> </data>
<data name="Error" xml:space="preserve">
<value>错误</value>
</data>
<data name="ExportSettingsSuccess" xml:space="preserve"> <data name="ExportSettingsSuccess" xml:space="preserve">
<value>导出成功</value> <value>导出成功</value>
</data> </data>
<data name="FailToStartLXMusicServer" xml:space="preserve"> <data name="FailToStartLXMusicServer" xml:space="preserve">
<value>无法连接到 LX 音乐服务器,请转到设置 - 播放源 - LX Music - LX 音乐服务器以检查是否正确输入链接</value> <value>无法连接到 LX 音乐服务器,请转到设置 - 播放源 - LX Music - LX 音乐服务器以检查是否正确输入链接</value>
</data> </data>
<data name="FileSystemServiceCleaningCache" xml:space="preserve">
<value>正在清理缓存...</value>
</data>
<data name="FileSystemServiceConnectFailed" xml:space="preserve">
<value>连接失败</value>
</data>
<data name="FileSystemServiceConnecting" xml:space="preserve">
<value>正在连接...</value>
</data>
<data name="FileSystemServiceFetchingFileList" xml:space="preserve">
<value>正在获取文件列表...</value>
</data>
<data name="FileSystemServiceParsing" xml:space="preserve">
<value>正在解析...</value>
</data>
<data name="FileSystemServicePrepareToClean" xml:space="preserve">
<value>正在准备清理缓存...</value>
</data>
<data name="FileSystemServiceReady" xml:space="preserve">
<value>就绪</value>
</data>
<data name="FileSystemServiceRootDirectoryWarning" xml:space="preserve">
<value>已检测到根目录路径。全磁盘索引可能包含大量非媒体文件,导致扫描时间过长。建议指定一个特定的子目录。</value>
</data>
<data name="FileSystemServiceWaitingForScan" xml:space="preserve">
<value>正在准备扫描...</value>
</data>
<data name="FullscreenMode" xml:space="preserve"> <data name="FullscreenMode" xml:space="preserve">
<value>全屏模式</value> <value>全屏模式</value>
</data> </data>
<data name="HostWindowClickThroughButton.Content" xml:space="preserve">
<value>锁定</value>
</data>
<data name="HostWindowClickThroughFlyoutItem.Text" xml:space="preserve">
<value>锁定</value>
</data>
<data name="HostWindowLockToolTip.Text" xml:space="preserve">
<value>锁定</value>
</data>
<data name="HostWindowMusicGalleryButtonToolTip.Content" xml:space="preserve"> <data name="HostWindowMusicGalleryButtonToolTip.Content" xml:space="preserve">
<value>音乐库</value> <value>音乐库</value>
</data> </data>
@@ -204,9 +216,6 @@
<data name="Jyutping" xml:space="preserve"> <data name="Jyutping" xml:space="preserve">
<value>粤语拼音</value> <value>粤语拼音</value>
</data> </data>
<data name="KeepAtLeastOneStatusDefault" xml:space="preserve">
<value>请确保至少有一个状态被设为默认</value>
</data>
<data name="LastFMAuthFailed" xml:space="preserve"> <data name="LastFMAuthFailed" xml:space="preserve">
<value>授权失败,请重试</value> <value>授权失败,请重试</value>
</data> </data>
@@ -270,18 +279,12 @@
<data name="LyricsPageSettings.Text" xml:space="preserve"> <data name="LyricsPageSettings.Text" xml:space="preserve">
<value>设置</value> <value>设置</value>
</data> </data>
<data name="LyricsPageTimelineOffsetButtonToolTip.Content" xml:space="preserve">
<value>歌词时间轴偏移</value>
</data>
<data name="LyricsPageTranslationEnabled.Description" xml:space="preserve"> <data name="LyricsPageTranslationEnabled.Description" xml:space="preserve">
<value>将优先读取歌词内翻译,若无匹配则向 LibreTranslate 服务器请求机器翻译</value> <value>将优先读取歌词内翻译,若无匹配则向 LibreTranslate 服务器请求机器翻译</value>
</data> </data>
<data name="LyricsPageTranslationEnabled.Header" xml:space="preserve"> <data name="LyricsPageTranslationEnabled.Header" xml:space="preserve">
<value>启用翻译</value> <value>启用翻译</value>
</data> </data>
<data name="LyricsPageTranslationOnly.Header" xml:space="preserve">
<value>仅显示翻译</value>
</data>
<data name="LyricsPageTranslationProviderPrefix.Header" xml:space="preserve"> <data name="LyricsPageTranslationProviderPrefix.Header" xml:space="preserve">
<value>翻译提供方</value> <value>翻译提供方</value>
</data> </data>
@@ -330,9 +333,6 @@
<data name="LyricsSearchControlSongInfoMapping.Text" xml:space="preserve"> <data name="LyricsSearchControlSongInfoMapping.Text" xml:space="preserve">
<value>歌曲信息映射</value> <value>歌曲信息映射</value>
</data> </data>
<data name="LyricsSearchControlTargetSearchProvider.Header" xml:space="preserve">
<value>目标歌词搜索提供方</value>
</data>
<data name="LyricsSearchControlTitle.Header" xml:space="preserve"> <data name="LyricsSearchControlTitle.Header" xml:space="preserve">
<value>标题</value> <value>标题</value>
</data> </data>
@@ -351,15 +351,9 @@
<data name="LyricsSearchProviderTtmlFile" xml:space="preserve"> <data name="LyricsSearchProviderTtmlFile" xml:space="preserve">
<value>本地 .TTML 文件</value> <value>本地 .TTML 文件</value>
</data> </data>
<data name="LyricsWindowImmersiveButtonToolTip.Content" xml:space="preserve">
<value>沉浸模式</value>
</data>
<data name="LyricsWindowSettingsControlLyricsWindowConfig.Text" xml:space="preserve"> <data name="LyricsWindowSettingsControlLyricsWindowConfig.Text" xml:space="preserve">
<value>配置</value> <value>配置</value>
</data> </data>
<data name="LyricsWindowSettingsControlLyricsWindowMode.Header" xml:space="preserve">
<value>歌词窗口模式</value>
</data>
<data name="LyricsWindowSettingsControlSetDefault.Text" xml:space="preserve"> <data name="LyricsWindowSettingsControlSetDefault.Text" xml:space="preserve">
<value>设置为默认</value> <value>设置为默认</value>
</data> </data>
@@ -378,9 +372,6 @@
<data name="MainPageAlbumArtOnly.Content" xml:space="preserve"> <data name="MainPageAlbumArtOnly.Content" xml:space="preserve">
<value>仅显示专辑封面区域</value> <value>仅显示专辑封面区域</value>
</data> </data>
<data name="MainPageEnterImmersiveModeHint" xml:space="preserve">
<value>再次悬停以显示切换按钮</value>
</data>
<data name="MainPageLyriscOnly.Content" xml:space="preserve"> <data name="MainPageLyriscOnly.Content" xml:space="preserve">
<value>仅显示歌词</value> <value>仅显示歌词</value>
</data> </data>
@@ -396,6 +387,18 @@
<data name="MainPageSplitView.Content" xml:space="preserve"> <data name="MainPageSplitView.Content" xml:space="preserve">
<value>拆分视图</value> <value>拆分视图</value>
</data> </data>
<data name="MediaSettingsControlLastSyncTime.Header" xml:space="preserve">
<value>上次同步时间</value>
</data>
<data name="MediaSettingsControlLocalFolder" xml:space="preserve">
<value>本地文件夹</value>
</data>
<data name="MediaSettingsControlNameSetting.Header" xml:space="preserve">
<value>名称</value>
</data>
<data name="MediaSettingsControlSyncNow.Content" xml:space="preserve">
<value>立即同步</value>
</data>
<data name="MusicGalleryPageAddToCustomList.Text" xml:space="preserve"> <data name="MusicGalleryPageAddToCustomList.Text" xml:space="preserve">
<value>添加到播放列表</value> <value>添加到播放列表</value>
</data> </data>
@@ -411,6 +414,12 @@
<data name="MusicGalleryPageAllSongs" xml:space="preserve"> <data name="MusicGalleryPageAllSongs" xml:space="preserve">
<value>所有音乐</value> <value>所有音乐</value>
</data> </data>
<data name="MusicGalleryPageDataSync.Message" xml:space="preserve">
<value>正在同步媒体库...</value>
</data>
<data name="MusicGalleryPageDataSyncError.Message" xml:space="preserve">
<value>同步媒体库时出现问题</value>
</data>
<data name="MusicGalleryPageEmptyPlayingQueue.Text" xml:space="preserve"> <data name="MusicGalleryPageEmptyPlayingQueue.Text" xml:space="preserve">
<value>清除播放队列</value> <value>清除播放队列</value>
</data> </data>
@@ -420,9 +429,6 @@
<data name="MusicGalleryPageFileArtist.Header" xml:space="preserve"> <data name="MusicGalleryPageFileArtist.Header" xml:space="preserve">
<value>艺术家</value> <value>艺术家</value>
</data> </data>
<data name="MusicGalleryPageFileInfo.Text" xml:space="preserve">
<value>文件信息</value>
</data>
<data name="MusicGalleryPageFileInfoBitDepth.Header" xml:space="preserve"> <data name="MusicGalleryPageFileInfoBitDepth.Header" xml:space="preserve">
<value>位深度</value> <value>位深度</value>
</data> </data>
@@ -456,15 +462,15 @@
<data name="MusicGalleryPageFileNotFound.Text" xml:space="preserve"> <data name="MusicGalleryPageFileNotFound.Text" xml:space="preserve">
<value>未在媒体库内找到任何歌曲</value> <value>未在媒体库内找到任何歌曲</value>
</data> </data>
<data name="MusicGalleryPageFolder.Text" xml:space="preserve">
<value>文件夹</value>
</data>
<data name="MusicGalleryPageImportFromFile.Text" xml:space="preserve"> <data name="MusicGalleryPageImportFromFile.Text" xml:space="preserve">
<value>从文件导入</value> <value>从文件导入</value>
</data> </data>
<data name="MusicGalleryPageNewPlaylist.Text" xml:space="preserve"> <data name="MusicGalleryPageNewPlaylist.Text" xml:space="preserve">
<value>创建播放列表</value> <value>创建播放列表</value>
</data> </data>
<data name="MusicGalleryPagePlayAll.Content" xml:space="preserve">
<value>播放全部</value>
</data>
<data name="MusicGalleryPagePlayingQueue.Text" xml:space="preserve"> <data name="MusicGalleryPagePlayingQueue.Text" xml:space="preserve">
<value>播放队列</value> <value>播放队列</value>
</data> </data>
@@ -489,9 +495,6 @@
<data name="MusicGalleryPageScrollToPlayingItem.Text" xml:space="preserve"> <data name="MusicGalleryPageScrollToPlayingItem.Text" xml:space="preserve">
<value>滚动到播放项</value> <value>滚动到播放项</value>
</data> </data>
<data name="MusicGalleryPageSelectAll.Content" xml:space="preserve">
<value>选择所有</value>
</data>
<data name="MusicGalleryPageSingleLoop.Text" xml:space="preserve"> <data name="MusicGalleryPageSingleLoop.Text" xml:space="preserve">
<value>单曲循环</value> <value>单曲循环</value>
</data> </data>
@@ -513,20 +516,29 @@
<data name="MusicGalleryPageSortType.Text" xml:space="preserve"> <data name="MusicGalleryPageSortType.Text" xml:space="preserve">
<value>排序类型</value> <value>排序类型</value>
</data> </data>
<data name="MusicGalleryPageStarredPlaylist.Content" xml:space="preserve">
<value>已加星标的播放列表</value>
</data>
<data name="MusicGalleryPageStopTrack.Text" xml:space="preserve"> <data name="MusicGalleryPageStopTrack.Text" xml:space="preserve">
<value>停止</value> <value>停止</value>
</data> </data>
<data name="MusicGalleryPageTitle" xml:space="preserve"> <data name="MusicGalleryPageTitle" xml:space="preserve">
<value>音乐库 - BetterLyrics</value> <value>音乐库 - BetterLyrics</value>
</data> </data>
<data name="MusicGalleryWindowDownButtonToolTip.Content" xml:space="preserve"> <data name="MusicSettingsControlAutoSyncInterval.Header" xml:space="preserve">
<value>收回</value> <value>自动同步频率</value>
</data> </data>
<data name="MusicGalleryWindowUpButtonToolTip.Content" xml:space="preserve"> <data name="MusicSettingsControlAutoSyncIntervalDisabled.Content" xml:space="preserve">
<value>展开</value> <value>从不</value>
</data>
<data name="MusicSettingsControlAutoSyncIntervalEveryDay.Content" xml:space="preserve">
<value>每天</value>
</data>
<data name="MusicSettingsControlAutoSyncIntervalEveryFifteenMin.Content" xml:space="preserve">
<value>每 15 分钟</value>
</data>
<data name="MusicSettingsControlAutoSyncIntervalEveryHour.Content" xml:space="preserve">
<value>每小时</value>
</data>
<data name="MusicSettingsControlAutoSyncIntervalEverySixHrs.Content" xml:space="preserve">
<value>每 6 小时</value>
</data> </data>
<data name="NarrowMode" xml:space="preserve"> <data name="NarrowMode" xml:space="preserve">
<value>窄屏模式</value> <value>窄屏模式</value>
@@ -543,12 +555,27 @@
<data name="PrivacyPolicy.Content" xml:space="preserve"> <data name="PrivacyPolicy.Content" xml:space="preserve">
<value>隐私政策</value> <value>隐私政策</value>
</data> </data>
<data name="RemoteServerConfigControlBrowse.Content" xml:space="preserve">
<value>浏览</value>
</data>
<data name="RemoteServerConfigControlName.Header" xml:space="preserve">
<value>名称</value>
</data>
<data name="RemoteServerConfigControlName.PlaceholderText" xml:space="preserve">
<value>留空将自动生成一个默认名称。</value>
</data>
<data name="RemoteServerConfigControlPassword.Header" xml:space="preserve"> <data name="RemoteServerConfigControlPassword.Header" xml:space="preserve">
<value>密码</value> <value>密码</value>
</data> </data>
<data name="RemoteServerConfigControlPath.Header" xml:space="preserve"> <data name="RemoteServerConfigControlPath.Header" xml:space="preserve">
<value>路径</value> <value>路径</value>
</data> </data>
<data name="RemoteServerConfigControlPathNotExisted" xml:space="preserve">
<value>无法找到指定的文件夹路径</value>
</data>
<data name="RemoteServerConfigControlPathRequired" xml:space="preserve">
<value>路径是必需的</value>
</data>
<data name="RemoteServerConfigControlPort.Header" xml:space="preserve"> <data name="RemoteServerConfigControlPort.Header" xml:space="preserve">
<value>端口</value> <value>端口</value>
</data> </data>
@@ -576,14 +603,11 @@
<data name="SetingsPageFeedback.Text" xml:space="preserve"> <data name="SetingsPageFeedback.Text" xml:space="preserve">
<value>反馈</value> <value>反馈</value>
</data> </data>
<data name="SetingsPageInstructions.Text" xml:space="preserve">
<value>操作指南</value>
</data>
<data name="SetingsPageSpecialThanks.Text" xml:space="preserve"> <data name="SetingsPageSpecialThanks.Text" xml:space="preserve">
<value>特别鸣谢</value> <value>特别鸣谢</value>
</data> </data>
<data name="SetingsPageThanks.Text" xml:space="preserve"> <data name="SetingsPageThanks.Text" xml:space="preserve">
<value>如果您喜欢这个项目,请考虑通过捐赠来支持它。您的支持将有助于保持项目的生命并鼓励进一步的发展。</value> <value>如果您喜欢这个项目,请考虑通过捐赠来支持它。您的支持将有助于保持项目的活力并鼓励进一步的发展。</value>
</data> </data>
<data name="SetingsPageUIUXRef.Text" xml:space="preserve"> <data name="SetingsPageUIUXRef.Text" xml:space="preserve">
<value>UI/UX 设计参考</value> <value>UI/UX 设计参考</value>
@@ -606,9 +630,6 @@
<data name="SettingsPageAddFolderButton.Content" xml:space="preserve"> <data name="SettingsPageAddFolderButton.Content" xml:space="preserve">
<value>添加</value> <value>添加</value>
</data> </data>
<data name="SettingsPageAdvanced.Text" xml:space="preserve">
<value>高级选项</value>
</data>
<data name="SettingsPageAlbum.Header" xml:space="preserve"> <data name="SettingsPageAlbum.Header" xml:space="preserve">
<value>专辑</value> <value>专辑</value>
</data> </data>
@@ -624,15 +645,9 @@
<data name="SettingsPageAlbumArtSearchProvidersConfig.Text" xml:space="preserve"> <data name="SettingsPageAlbumArtSearchProvidersConfig.Text" xml:space="preserve">
<value>配置专辑封面源</value> <value>配置专辑封面源</value>
</data> </data>
<data name="SettingsPageAlbumArtSize.Header" xml:space="preserve">
<value>专辑封面大小</value>
</data>
<data name="SettingsPageAlbumEffect.Text" xml:space="preserve"> <data name="SettingsPageAlbumEffect.Text" xml:space="preserve">
<value>专辑封面效果</value> <value>专辑封面效果</value>
</data> </data>
<data name="SettingsPageAlbumLib.Content" xml:space="preserve">
<value>专辑封面源</value>
</data>
<data name="SettingsPageAlbumRadius.Header" xml:space="preserve"> <data name="SettingsPageAlbumRadius.Header" xml:space="preserve">
<value>圆角半径</value> <value>圆角半径</value>
</data> </data>
@@ -663,12 +678,6 @@
<data name="SettingsPageAppAppearance.Text" xml:space="preserve"> <data name="SettingsPageAppAppearance.Text" xml:space="preserve">
<value>应用外观</value> <value>应用外观</value>
</data> </data>
<data name="SettingsPageAppBehavior.Text" xml:space="preserve">
<value>一般行为</value>
</data>
<data name="SettingsPageApply.Content" xml:space="preserve">
<value>应用</value>
</data>
<data name="SettingsPageArtist.Header" xml:space="preserve"> <data name="SettingsPageArtist.Header" xml:space="preserve">
<value>艺术家</value> <value>艺术家</value>
</data> </data>
@@ -687,21 +696,12 @@
<data name="SettingsPageAutoStart.Header" xml:space="preserve"> <data name="SettingsPageAutoStart.Header" xml:space="preserve">
<value>自动启动</value> <value>自动启动</value>
</data> </data>
<data name="SettingsPageAutoStartWindow.Header" xml:space="preserve">
<value>启动应用程序时</value>
</data>
<data name="SettingsPageBackdrop.Header" xml:space="preserve">
<value>歌词背景材质</value>
</data>
<data name="SettingsPageBackgroundOverlay.Text" xml:space="preserve"> <data name="SettingsPageBackgroundOverlay.Text" xml:space="preserve">
<value>歌词背景</value> <value>歌词背景</value>
</data> </data>
<data name="SettingsPageBlurAmount.Header" xml:space="preserve"> <data name="SettingsPageBlurAmount.Header" xml:space="preserve">
<value>模糊量</value> <value>模糊量</value>
</data> </data>
<data name="SettingsPageBorderless.Header" xml:space="preserve">
<value>无边框窗口</value>
</data>
<data name="SettingsPageCache.Description" xml:space="preserve"> <data name="SettingsPageCache.Description" xml:space="preserve">
<value>包括日志文件,网络歌词缓存</value> <value>包括日志文件,网络歌词缓存</value>
</data> </data>
@@ -712,7 +712,7 @@
<value>居中</value> <value>居中</value>
</data> </data>
<data name="SettingsPageCheckShortcut.Content" xml:space="preserve"> <data name="SettingsPageCheckShortcut.Content" xml:space="preserve">
<value>检查快捷方式</value> <value>检查快捷</value>
</data> </data>
<data name="SettingsPageChinese.Header" xml:space="preserve"> <data name="SettingsPageChinese.Header" xml:space="preserve">
<value>中文注音</value> <value>中文注音</value>
@@ -738,9 +738,6 @@
<data name="SettingsPageCollapseDropdown.Content" xml:space="preserve"> <data name="SettingsPageCollapseDropdown.Content" xml:space="preserve">
<value>折叠下拉列表</value> <value>折叠下拉列表</value>
</data> </data>
<data name="SettingsPageCompactTitleBar.Content" xml:space="preserve">
<value>紧凑</value>
</data>
<data name="SettingsPageConfigName.Description" xml:space="preserve"> <data name="SettingsPageConfigName.Description" xml:space="preserve">
<value>命名记录的窗口状态可以帮助您更好地区分它们</value> <value>命名记录的窗口状态可以帮助您更好地区分它们</value>
</data> </data>
@@ -759,18 +756,12 @@
<data name="SettingsPageCrossfade.Content" xml:space="preserve"> <data name="SettingsPageCrossfade.Content" xml:space="preserve">
<value>交叉淡入淡出</value> <value>交叉淡入淡出</value>
</data> </data>
<data name="SettingsPageCurrentLyricsWindowStatus.Text" xml:space="preserve">
<value>当前歌词窗口状态</value>
</data>
<data name="SettingsPageCutletDockerServer.Header" xml:space="preserve"> <data name="SettingsPageCutletDockerServer.Header" xml:space="preserve">
<value>cutlet-docker 音译服务</value> <value>cutlet-docker 音译服务</value>
</data> </data>
<data name="SettingsPageDark.Content" xml:space="preserve"> <data name="SettingsPageDark.Content" xml:space="preserve">
<value>深色</value> <value>深色</value>
</data> </data>
<data name="SettingsPageDebugOverlay.Header" xml:space="preserve">
<value>显示调试覆盖层</value>
</data>
<data name="SettingsPageDelete.Text" xml:space="preserve"> <data name="SettingsPageDelete.Text" xml:space="preserve">
<value>删除</value> <value>删除</value>
</data> </data>
@@ -801,15 +792,9 @@
<data name="SettingsPageDockPlacementTop.Content" xml:space="preserve"> <data name="SettingsPageDockPlacementTop.Content" xml:space="preserve">
<value>顶部</value> <value>顶部</value>
</data> </data>
<data name="SettingsPageDockWindowHeight.Header" xml:space="preserve">
<value>窗口高度</value>
</data>
<data name="SettingsPageDragArea.Header" xml:space="preserve"> <data name="SettingsPageDragArea.Header" xml:space="preserve">
<value>可拖动区域</value> <value>可拖动区域</value>
</data> </data>
<data name="SettingsPageEasingFuncType.Header" xml:space="preserve">
<value>缓动动画类型</value>
</data>
<data name="SettingsPageEasingTypeEaseInOutBack.Content" xml:space="preserve"> <data name="SettingsPageEasingTypeEaseInOutBack.Content" xml:space="preserve">
<value>回弹缓入缓出</value> <value>回弹缓入缓出</value>
</data> </data>
@@ -873,18 +858,15 @@
<data name="SettingsPageExitOnLyricsWindowClosed.Header" xml:space="preserve"> <data name="SettingsPageExitOnLyricsWindowClosed.Header" xml:space="preserve">
<value>关闭歌词窗口时退出程序</value> <value>关闭歌词窗口时退出程序</value>
</data> </data>
<data name="SettingsPageExportPlayHistoryButton.Content" xml:space="preserve">
<value />
</data>
<data name="SettingsPageExportSettingsButton.Content" xml:space="preserve"> <data name="SettingsPageExportSettingsButton.Content" xml:space="preserve">
<value>导出设置</value> <value>导出设置</value>
</data> </data>
<data name="SettingsPageExtendedTitleBar.Content" xml:space="preserve">
<value>扩展</value>
</data>
<data name="SettingsPageFan.Header" xml:space="preserve"> <data name="SettingsPageFan.Header" xml:space="preserve">
<value>扇形歌词</value> <value>扇形歌词</value>
</data> </data>
<data name="SettingsPageFAQ.Content" xml:space="preserve">
<value>常见问题</value>
</data>
<data name="SettingsPageFixedTimeStep.Header" xml:space="preserve"> <data name="SettingsPageFixedTimeStep.Header" xml:space="preserve">
<value>固定时间步长渲染</value> <value>固定时间步长渲染</value>
</data> </data>
@@ -921,9 +903,6 @@
<data name="SettingsPageHeight.Header" xml:space="preserve"> <data name="SettingsPageHeight.Header" xml:space="preserve">
<value>高度</value> <value>高度</value>
</data> </data>
<data name="SettingsPageHello.Text" xml:space="preserve">
<value>您好</value>
</data>
<data name="SettingsPageHelpUsTranslate.Content" xml:space="preserve"> <data name="SettingsPageHelpUsTranslate.Content" xml:space="preserve">
<value>帮助我们翻译此应用程序</value> <value>帮助我们翻译此应用程序</value>
</data> </data>
@@ -954,9 +933,6 @@
<data name="SettingsPageJapanese.Header" xml:space="preserve"> <data name="SettingsPageJapanese.Header" xml:space="preserve">
<value>日语注音</value> <value>日语注音</value>
</data> </data>
<data name="SettingsPageJoinNowButton.Content" xml:space="preserve">
<value>立即加入</value>
</data>
<data name="SettingsPageJyutping.Content" xml:space="preserve"> <data name="SettingsPageJyutping.Content" xml:space="preserve">
<value>粤语拼音</value> <value>粤语拼音</value>
</data> </data>
@@ -1005,18 +981,12 @@
<data name="SettingsPageLight.Content" xml:space="preserve"> <data name="SettingsPageLight.Content" xml:space="preserve">
<value>浅色</value> <value>浅色</value>
</data> </data>
<data name="SettingsPageLinkedFile.Text" xml:space="preserve">
<value>链接的本地文件</value>
</data>
<data name="SettingsPageListenNewSession.Header" xml:space="preserve"> <data name="SettingsPageListenNewSession.Header" xml:space="preserve">
<value>启用对新播放源的监听</value> <value>启用对新播放源的监听</value>
</data> </data>
<data name="SettingsPageLocalFolder.Text" xml:space="preserve"> <data name="SettingsPageLocalFolder.Text" xml:space="preserve">
<value>本地文件夹</value> <value>本地文件夹</value>
</data> </data>
<data name="SettingsPageLog.Header" xml:space="preserve">
<value>日志记录</value>
</data>
<data name="SettingsPageLongSyllableDuration.Header" xml:space="preserve"> <data name="SettingsPageLongSyllableDuration.Header" xml:space="preserve">
<value>长音节阈值</value> <value>长音节阈值</value>
</data> </data>
@@ -1071,15 +1041,6 @@
<data name="SettingsPageLyricsFgFontColor.Header" xml:space="preserve"> <data name="SettingsPageLyricsFgFontColor.Header" xml:space="preserve">
<value>当前行</value> <value>当前行</value>
</data> </data>
<data name="SettingsPageLyricsFgFontColorAdaptiveColored.Content" xml:space="preserve">
<value>适应歌词背景(彩色)</value>
</data>
<data name="SettingsPageLyricsFgFontColorAdaptiveGrayed.Content" xml:space="preserve">
<value>适应歌词背景(灰色)</value>
</data>
<data name="SettingsPageLyricsFgFontColorCustom.Content" xml:space="preserve">
<value>自定义</value>
</data>
<data name="SettingsPageLyricsFloatAnimation.Header" xml:space="preserve"> <data name="SettingsPageLyricsFloatAnimation.Header" xml:space="preserve">
<value>浮动动画</value> <value>浮动动画</value>
</data> </data>
@@ -1107,27 +1068,12 @@
<data name="SettingsPageLyricsGlowEffect.Header" xml:space="preserve"> <data name="SettingsPageLyricsGlowEffect.Header" xml:space="preserve">
<value>发光效果</value> <value>发光效果</value>
</data> </data>
<data name="SettingsPageLyricsHighlight.Header" xml:space="preserve">
<value>高亮</value>
</data>
<data name="SettingsPageLyricsHighlightScope.Header" xml:space="preserve">
<value>原文高亮显示范围</value>
</data>
<data name="SettingsPageLyricsLeft.Content" xml:space="preserve">
<value>靠左</value>
</data>
<data name="SettingsPageLyricsLight.Content" xml:space="preserve"> <data name="SettingsPageLyricsLight.Content" xml:space="preserve">
<value>细体</value> <value>细体</value>
</data> </data>
<data name="SettingsPageLyricsLineFade.Header" xml:space="preserve">
<value>播放区域边缘渐变</value>
</data>
<data name="SettingsPageLyricsLineSpacingFactor.Header" xml:space="preserve"> <data name="SettingsPageLyricsLineSpacingFactor.Header" xml:space="preserve">
<value>行间距</value> <value>行间距</value>
</data> </data>
<data name="SettingsPageLyricsLineSpacingFactorUnit.Text" xml:space="preserve">
<value> 倍行高</value>
</data>
<data name="SettingsPageLyricsMedium.Content" xml:space="preserve"> <data name="SettingsPageLyricsMedium.Content" xml:space="preserve">
<value>中等</value> <value>中等</value>
</data> </data>
@@ -1170,9 +1116,6 @@
<data name="SettingsPageLyricsSemiLight.Content" xml:space="preserve"> <data name="SettingsPageLyricsSemiLight.Content" xml:space="preserve">
<value>次细</value> <value>次细</value>
</data> </data>
<data name="SettingsPageLyricsShadow.Header" xml:space="preserve">
<value>阴影</value>
</data>
<data name="SettingsPageLyricsStyle.Text" xml:space="preserve"> <data name="SettingsPageLyricsStyle.Text" xml:space="preserve">
<value>歌词样式</value> <value>歌词样式</value>
</data> </data>
@@ -1188,30 +1131,15 @@
<data name="SettingsPageLyricsTimelineThreshold.Header" xml:space="preserve"> <data name="SettingsPageLyricsTimelineThreshold.Header" xml:space="preserve">
<value>歌词时间轴同步阈值</value> <value>歌词时间轴同步阈值</value>
</data> </data>
<data name="SettingsPageLyricsTranslationHighlight.Header" xml:space="preserve">
<value>翻译高亮</value>
</data>
<data name="SettingsPageLyricsTranslationSeparator.Header" xml:space="preserve">
<value>原文译文分隔符</value>
</data>
<data name="SettingsPageLyricsVerticalEdgeOpacity.Header" xml:space="preserve">
<value>上下边缘不透明度</value>
</data>
<data name="SettingsPageLyricsWindow.Text" xml:space="preserve"> <data name="SettingsPageLyricsWindow.Text" xml:space="preserve">
<value>歌词窗口</value> <value>歌词窗口</value>
</data> </data>
<data name="SettingsPageLyricsWindowManager.Text" xml:space="preserve">
<value>歌词窗口管理器</value>
</data>
<data name="SettingsPageLyricsWindowMgr.Content" xml:space="preserve"> <data name="SettingsPageLyricsWindowMgr.Content" xml:space="preserve">
<value>歌词窗口管理器</value> <value>歌词窗口管理器</value>
</data> </data>
<data name="SettingsPageLyricsWindowSwitchHotKey.Header" xml:space="preserve"> <data name="SettingsPageLyricsWindowSwitchHotKey.Header" xml:space="preserve">
<value>歌词窗口状态切换快捷键</value> <value>歌词窗口状态切换快捷键</value>
</data> </data>
<data name="SettingsPageLyricsWindowToolTip.Content" xml:space="preserve">
<value>歌词窗口</value>
</data>
<data name="SettingsPageMatchingThreshold.Description" xml:space="preserve"> <data name="SettingsPageMatchingThreshold.Description" xml:space="preserve">
<value>调整此值将影响顺序搜索和最佳匹配搜索结果,但不会影响手动歌词搜索界面中的搜索结果</value> <value>调整此值将影响顺序搜索和最佳匹配搜索结果,但不会影响手动歌词搜索界面中的搜索结果</value>
</data> </data>
@@ -1248,18 +1176,12 @@
<data name="SettingsPageMusicLib.Header" xml:space="preserve"> <data name="SettingsPageMusicLib.Header" xml:space="preserve">
<value>本地媒体库</value> <value>本地媒体库</value>
</data> </data>
<data name="SettingsPageMusicLibRealTimeWatch.Header" xml:space="preserve">
<value>实时监听文件变化</value>
</data>
<data name="SettingsPageNarrowMode.Text" xml:space="preserve"> <data name="SettingsPageNarrowMode.Text" xml:space="preserve">
<value>窄屏模式</value> <value>窄屏模式</value>
</data> </data>
<data name="SettingsPageNextSongHotKey.Header" xml:space="preserve"> <data name="SettingsPageNextSongHotKey.Header" xml:space="preserve">
<value>下一曲目快捷键</value> <value>下一曲目快捷键</value>
</data> </data>
<data name="SettingsPageNoBackdrop.Content" xml:space="preserve">
<value>无</value>
</data>
<data name="SettingsPageOctTree.Content" xml:space="preserve"> <data name="SettingsPageOctTree.Content" xml:space="preserve">
<value>激进</value> <value>激进</value>
</data> </data>
@@ -1287,9 +1209,6 @@
<data name="SettingsPagePathIncludingOthersInfo" xml:space="preserve"> <data name="SettingsPagePathIncludingOthersInfo" xml:space="preserve">
<value>该文件夹包含已添加文件夹,请删除这些文件夹以添加该文件夹</value> <value>该文件夹包含已添加文件夹,请删除这些文件夹以添加该文件夹</value>
</data> </data>
<data name="SettingsPagePathNotFound.Text" xml:space="preserve">
<value>无法在您的计算机中找到该路径</value>
</data>
<data name="SettingsPagePatrons.Text" xml:space="preserve"> <data name="SettingsPagePatrons.Text" xml:space="preserve">
<value>赞助</value> <value>赞助</value>
</data> </data>
@@ -1335,15 +1254,9 @@
<data name="SettingsPageRealtimeStatus.Text" xml:space="preserve"> <data name="SettingsPageRealtimeStatus.Text" xml:space="preserve">
<value>实时状态</value> <value>实时状态</value>
</data> </data>
<data name="SettingsPageRecord.Content" xml:space="preserve">
<value>记录</value>
</data>
<data name="SettingsPageRecordedWindowStatus.Text" xml:space="preserve"> <data name="SettingsPageRecordedWindowStatus.Text" xml:space="preserve">
<value>记录的窗口状态</value> <value>记录的窗口状态</value>
</data> </data>
<data name="SettingsPageReference.Header" xml:space="preserve">
<value>参考链接</value>
</data>
<data name="SettingsPageRefreshDropdown.Content" xml:space="preserve"> <data name="SettingsPageRefreshDropdown.Content" xml:space="preserve">
<value>刷新下拉列表</value> <value>刷新下拉列表</value>
</data> </data>
@@ -1362,9 +1275,6 @@
<data name="SettingsPageRight.Content" xml:space="preserve"> <data name="SettingsPageRight.Content" xml:space="preserve">
<value>靠右</value> <value>靠右</value>
</data> </data>
<data name="SettingsPageRomaji.Header" xml:space="preserve">
<value>日语注音</value>
</data>
<data name="SettingsPageScope.Header" xml:space="preserve"> <data name="SettingsPageScope.Header" xml:space="preserve">
<value>范围</value> <value>范围</value>
</data> </data>
@@ -1411,10 +1321,10 @@
<value>快捷键</value> <value>快捷键</value>
</data> </data>
<data name="SettingsPageShortcutRegFailInfo" xml:space="preserve"> <data name="SettingsPageShortcutRegFailInfo" xml:space="preserve">
<value>该键未成功注册</value> <value>该快捷键未成功注册</value>
</data> </data>
<data name="SettingsPageShortcutRegSuccessInfo" xml:space="preserve"> <data name="SettingsPageShortcutRegSuccessInfo" xml:space="preserve">
<value>该键已成功注册</value> <value>该快捷键已成功注册</value>
</data> </data>
<data name="SettingsPageShowAlbum.Header" xml:space="preserve"> <data name="SettingsPageShowAlbum.Header" xml:space="preserve">
<value>显示专辑</value> <value>显示专辑</value>
@@ -1431,18 +1341,12 @@
<data name="SettingsPageShowInSwitchers.Header" xml:space="preserve"> <data name="SettingsPageShowInSwitchers.Header" xml:space="preserve">
<value>在系统环境中显示</value> <value>在系统环境中显示</value>
</data> </data>
<data name="SettingsPageShowLayoutDragger.Header" xml:space="preserve">
<value>显示布局拆分器</value>
</data>
<data name="SettingsPageShowTitle.Header" xml:space="preserve"> <data name="SettingsPageShowTitle.Header" xml:space="preserve">
<value>显示标题</value> <value>显示标题</value>
</data> </data>
<data name="SettingsPageSlide.Content" xml:space="preserve"> <data name="SettingsPageSlide.Content" xml:space="preserve">
<value>滑动</value> <value>滑动</value>
</data> </data>
<data name="SettingsPageSliderPrefix.Text" xml:space="preserve">
<value>当前值: </value>
</data>
<data name="SettingsPageSnowFlakeLayer.Header" xml:space="preserve"> <data name="SettingsPageSnowFlakeLayer.Header" xml:space="preserve">
<value>雪花层</value> <value>雪花层</value>
</data> </data>
@@ -1485,6 +1389,9 @@
<data name="SettingsPageStartup.Text" xml:space="preserve"> <data name="SettingsPageStartup.Text" xml:space="preserve">
<value>启动</value> <value>启动</value>
</data> </data>
<data name="SettingsPageStats.Content" xml:space="preserve">
<value>统计数据</value>
</data>
<data name="SettingsPageStopTrackOnGalleryWindowClosed.Header" xml:space="preserve"> <data name="SettingsPageStopTrackOnGalleryWindowClosed.Header" xml:space="preserve">
<value>关闭音乐库窗口时停止播放</value> <value>关闭音乐库窗口时停止播放</value>
</data> </data>
@@ -1503,9 +1410,6 @@
<data name="SettingsPageTaskbarPlacement.Header" xml:space="preserve"> <data name="SettingsPageTaskbarPlacement.Header" xml:space="preserve">
<value>任务栏固定位置</value> <value>任务栏固定位置</value>
</data> </data>
<data name="SettingsPageThanksForPurchasing.Text" xml:space="preserve">
<value>感谢您购买 BetterLyrics</value>
</data>
<data name="SettingsPageThanksList.Header" xml:space="preserve"> <data name="SettingsPageThanksList.Header" xml:space="preserve">
<value>致谢名单</value> <value>致谢名单</value>
</data> </data>
@@ -1524,12 +1428,6 @@
<data name="SettingsPageTitleBarAreaWhole.Content" xml:space="preserve"> <data name="SettingsPageTitleBarAreaWhole.Content" xml:space="preserve">
<value>整个窗口</value> <value>整个窗口</value>
</data> </data>
<data name="SettingsPageTitleBarType.Header" xml:space="preserve">
<value>标题栏大小</value>
</data>
<data name="SettingsPageToggleHotKey.Header" xml:space="preserve">
<value>切入与切出快捷键</value>
</data>
<data name="SettingsPageTranslatedText.Header" xml:space="preserve"> <data name="SettingsPageTranslatedText.Header" xml:space="preserve">
<value>译文</value> <value>译文</value>
</data> </data>
@@ -1539,9 +1437,6 @@
<data name="SettingsPageTranslationConfig.Header" xml:space="preserve"> <data name="SettingsPageTranslationConfig.Header" xml:space="preserve">
<value>LibreTranslate 翻译服务</value> <value>LibreTranslate 翻译服务</value>
</data> </data>
<data name="SettingsPageTranslationInfoLink.Text" xml:space="preserve">
<value>访问 https://github.com/LibreTranslate/LibreTranslate 获取安装教程及更多信息(本软件与该翻译服务无任何联系)</value>
</data>
<data name="SettingsPageUserWhoPurchased.Text" xml:space="preserve"> <data name="SettingsPageUserWhoPurchased.Text" xml:space="preserve">
<value>以及购买支持 BetterLyrics 的用户</value> <value>以及购买支持 BetterLyrics 的用户</value>
</data> </data>
@@ -1554,9 +1449,6 @@
<data name="SettingsPageWidth.Header" xml:space="preserve"> <data name="SettingsPageWidth.Header" xml:space="preserve">
<value>宽度</value> <value>宽度</value>
</data> </data>
<data name="SettingsPageWindowBounds.Header" xml:space="preserve">
<value>窗口边框</value>
</data>
<data name="SettingsPageWorkArea.Description" xml:space="preserve"> <data name="SettingsPageWorkArea.Description" xml:space="preserve">
<value>作为一个单独的工作区,停靠到屏幕上/下边缘</value> <value>作为一个单独的工作区,停靠到屏幕上/下边缘</value>
</data> </data>
@@ -1572,6 +1464,39 @@
<data name="StandardMode" xml:space="preserve"> <data name="StandardMode" xml:space="preserve">
<value>标准模式</value> <value>标准模式</value>
</data> </data>
<data name="StatsDashboardControlSources.Text" xml:space="preserve">
<value>播放源</value>
</data>
<data name="StatsDashboardControlThisMonth.Header" xml:space="preserve">
<value>本月</value>
</data>
<data name="StatsDashboardControlThisQuarter.Header" xml:space="preserve">
<value>本季度</value>
</data>
<data name="StatsDashboardControlThisWeek.Header" xml:space="preserve">
<value>本周</value>
</data>
<data name="StatsDashboardControlThisYear.Header" xml:space="preserve">
<value>本年度</value>
</data>
<data name="StatsDashboardControlToday.Header" xml:space="preserve">
<value>今日</value>
</data>
<data name="StatsDashboardControlTopArtists.Text" xml:space="preserve">
<value>最热爱的艺人</value>
</data>
<data name="StatsDashboardControlTopSongs.Text" xml:space="preserve">
<value>最喜欢的歌曲</value>
</data>
<data name="StatsDashboardControlTopSource.Text" xml:space="preserve">
<value>最常用的播放源</value>
</data>
<data name="StatsDashboardControlTotalDuration.Text" xml:space="preserve">
<value>总时长</value>
</data>
<data name="StatsDashboardControlTracksPlayed.Text" xml:space="preserve">
<value>播放的曲目</value>
</data>
<data name="SystemTrayExit.Text" xml:space="preserve"> <data name="SystemTrayExit.Text" xml:space="preserve">
<value>退出程序</value> <value>退出程序</value>
</data> </data>
@@ -1581,9 +1506,6 @@
<data name="SystemTrayMusicGallery.Text" xml:space="preserve"> <data name="SystemTrayMusicGallery.Text" xml:space="preserve">
<value>打开音乐库</value> <value>打开音乐库</value>
</data> </data>
<data name="SystemTrayPageTitle" xml:space="preserve">
<value>系统托盘 - BetterLyrics</value>
</data>
<data name="SystemTrayResetWindowPosition.Text" xml:space="preserve"> <data name="SystemTrayResetWindowPosition.Text" xml:space="preserve">
<value>重置窗口位置</value> <value>重置窗口位置</value>
</data> </data>

View File

@@ -129,21 +129,12 @@
<data name="AlbumArtSearchSMTCProvider" xml:space="preserve"> <data name="AlbumArtSearchSMTCProvider" xml:space="preserve">
<value>音樂播放器</value> <value>音樂播放器</value>
</data> </data>
<data name="AllLyricsSettingsControlPictureInPicture.Content" xml:space="preserve">
<value>子母畫面模式</value>
</data>
<data name="AppSettingsControlGeneral.Text" xml:space="preserve"> <data name="AppSettingsControlGeneral.Text" xml:space="preserve">
<value>視窗</value> <value>視窗</value>
</data> </data>
<data name="ArtistsSplitHint.Text" xml:space="preserve"> <data name="ArtistsSplitHint.Text" xml:space="preserve">
<value>輸入多位演出者時,請使用以下其中一種分隔符號進行分隔(請勿混合使用)</value> <value>輸入多位演出者時,請使用以下其中一種分隔符號進行分隔(請勿混合使用)</value>
</data> </data>
<data name="BaseWindowHostInfoBarCheckBox.Content" xml:space="preserve">
<value>不再顯示此訊息</value>
</data>
<data name="BaseWindowMiniFlyoutItem.Text" xml:space="preserve">
<value>子母畫面模式</value>
</data>
<data name="Cancel" xml:space="preserve"> <data name="Cancel" xml:space="preserve">
<value>取消</value> <value>取消</value>
</data> </data>
@@ -168,24 +159,45 @@
<data name="DockedMode" xml:space="preserve"> <data name="DockedMode" xml:space="preserve">
<value>停靠模式</value> <value>停靠模式</value>
</data> </data>
<data name="Error" xml:space="preserve">
<value>錯誤</value>
</data>
<data name="ExportSettingsSuccess" xml:space="preserve"> <data name="ExportSettingsSuccess" xml:space="preserve">
<value>匯出成功</value> <value>匯出成功</value>
</data> </data>
<data name="FailToStartLXMusicServer" xml:space="preserve"> <data name="FailToStartLXMusicServer" xml:space="preserve">
<value>無法連線到 LX 音樂伺服器,請轉到設定 - 播放來源 - LX Music - LX 音樂伺服器以檢查是否正確輸入連結</value> <value>無法連線到 LX 音樂伺服器,請轉到設定 - 播放來源 - LX Music - LX 音樂伺服器以檢查是否正確輸入連結</value>
</data> </data>
<data name="FileSystemServiceCleaningCache" xml:space="preserve">
<value>清除快取...</value>
</data>
<data name="FileSystemServiceConnectFailed" xml:space="preserve">
<value>連線失敗</value>
</data>
<data name="FileSystemServiceConnecting" xml:space="preserve">
<value>連線中...</value>
</data>
<data name="FileSystemServiceFetchingFileList" xml:space="preserve">
<value>擷取檔案清單...</value>
</data>
<data name="FileSystemServiceParsing" xml:space="preserve">
<value>解析中…</value>
</data>
<data name="FileSystemServicePrepareToClean" xml:space="preserve">
<value>準備清除快取...</value>
</data>
<data name="FileSystemServiceReady" xml:space="preserve">
<value>準備就緒</value>
</data>
<data name="FileSystemServiceRootDirectoryWarning" xml:space="preserve">
<value>已偵測到根目錄路徑。全磁碟索引可能包含大量非媒體檔案,導致掃描時間過長。建議指定特定的子目錄。</value>
</data>
<data name="FileSystemServiceWaitingForScan" xml:space="preserve">
<value>等待掃描...</value>
</data>
<data name="FullscreenMode" xml:space="preserve"> <data name="FullscreenMode" xml:space="preserve">
<value>全螢幕模式</value> <value>全螢幕模式</value>
</data> </data>
<data name="HostWindowClickThroughButton.Content" xml:space="preserve">
<value>鎖定</value>
</data>
<data name="HostWindowClickThroughFlyoutItem.Text" xml:space="preserve">
<value>鎖定</value>
</data>
<data name="HostWindowLockToolTip.Text" xml:space="preserve">
<value>鎖定</value>
</data>
<data name="HostWindowMusicGalleryButtonToolTip.Content" xml:space="preserve"> <data name="HostWindowMusicGalleryButtonToolTip.Content" xml:space="preserve">
<value>音樂庫</value> <value>音樂庫</value>
</data> </data>
@@ -204,9 +216,6 @@
<data name="Jyutping" xml:space="preserve"> <data name="Jyutping" xml:space="preserve">
<value>粵語拼音</value> <value>粵語拼音</value>
</data> </data>
<data name="KeepAtLeastOneStatusDefault" xml:space="preserve">
<value>請確保至少有一個狀態被設為預設</value>
</data>
<data name="LastFMAuthFailed" xml:space="preserve"> <data name="LastFMAuthFailed" xml:space="preserve">
<value>授權失敗,請重試</value> <value>授權失敗,請重試</value>
</data> </data>
@@ -270,18 +279,12 @@
<data name="LyricsPageSettings.Text" xml:space="preserve"> <data name="LyricsPageSettings.Text" xml:space="preserve">
<value>設定</value> <value>設定</value>
</data> </data>
<data name="LyricsPageTimelineOffsetButtonToolTip.Content" xml:space="preserve">
<value>歌詞時間軸偏移</value>
</data>
<data name="LyricsPageTranslationEnabled.Description" xml:space="preserve"> <data name="LyricsPageTranslationEnabled.Description" xml:space="preserve">
<value>將優先讀取歌詞內翻譯,若無符合則向 LibreTranslate 伺服器請求機器翻譯</value> <value>將優先讀取歌詞內翻譯,若無符合則向 LibreTranslate 伺服器請求機器翻譯</value>
</data> </data>
<data name="LyricsPageTranslationEnabled.Header" xml:space="preserve"> <data name="LyricsPageTranslationEnabled.Header" xml:space="preserve">
<value>啟用翻譯</value> <value>啟用翻譯</value>
</data> </data>
<data name="LyricsPageTranslationOnly.Header" xml:space="preserve">
<value>僅顯示翻譯</value>
</data>
<data name="LyricsPageTranslationProviderPrefix.Header" xml:space="preserve"> <data name="LyricsPageTranslationProviderPrefix.Header" xml:space="preserve">
<value>翻譯提供者</value> <value>翻譯提供者</value>
</data> </data>
@@ -301,7 +304,7 @@
<value>自動產生</value> <value>自動產生</value>
</data> </data>
<data name="LyricsSearchControlDurauion.Header" xml:space="preserve"> <data name="LyricsSearchControlDurauion.Header" xml:space="preserve">
<value>長</value> <value>長</value>
</data> </data>
<data name="LyricsSearchControlHelp.Text" xml:space="preserve"> <data name="LyricsSearchControlHelp.Text" xml:space="preserve">
<value>* 儲存變更後立即生效,隨後歌曲歌詞將透過對應資訊和目標歌詞進行檢索;標記為純音樂將直接恢復為純音樂預留位置歌詞。重設後將恢復原始資料檢索。</value> <value>* 儲存變更後立即生效,隨後歌曲歌詞將透過對應資訊和目標歌詞進行檢索;標記為純音樂將直接恢復為純音樂預留位置歌詞。重設後將恢復原始資料檢索。</value>
@@ -330,9 +333,6 @@
<data name="LyricsSearchControlSongInfoMapping.Text" xml:space="preserve"> <data name="LyricsSearchControlSongInfoMapping.Text" xml:space="preserve">
<value>歌曲資訊對應</value> <value>歌曲資訊對應</value>
</data> </data>
<data name="LyricsSearchControlTargetSearchProvider.Header" xml:space="preserve">
<value>目標歌詞搜尋提供者</value>
</data>
<data name="LyricsSearchControlTitle.Header" xml:space="preserve"> <data name="LyricsSearchControlTitle.Header" xml:space="preserve">
<value>標題</value> <value>標題</value>
</data> </data>
@@ -351,15 +351,9 @@
<data name="LyricsSearchProviderTtmlFile" xml:space="preserve"> <data name="LyricsSearchProviderTtmlFile" xml:space="preserve">
<value>本機 .TTML 檔案</value> <value>本機 .TTML 檔案</value>
</data> </data>
<data name="LyricsWindowImmersiveButtonToolTip.Content" xml:space="preserve">
<value>沉浸模式</value>
</data>
<data name="LyricsWindowSettingsControlLyricsWindowConfig.Text" xml:space="preserve"> <data name="LyricsWindowSettingsControlLyricsWindowConfig.Text" xml:space="preserve">
<value>配置</value> <value>配置</value>
</data> </data>
<data name="LyricsWindowSettingsControlLyricsWindowMode.Header" xml:space="preserve">
<value>歌詞視窗模式</value>
</data>
<data name="LyricsWindowSettingsControlSetDefault.Text" xml:space="preserve"> <data name="LyricsWindowSettingsControlSetDefault.Text" xml:space="preserve">
<value>設為預設</value> <value>設為預設</value>
</data> </data>
@@ -378,9 +372,6 @@
<data name="MainPageAlbumArtOnly.Content" xml:space="preserve"> <data name="MainPageAlbumArtOnly.Content" xml:space="preserve">
<value>僅顯示專輯封面區域</value> <value>僅顯示專輯封面區域</value>
</data> </data>
<data name="MainPageEnterImmersiveModeHint" xml:space="preserve">
<value>再次懸停以顯示切換按鈕</value>
</data>
<data name="MainPageLyriscOnly.Content" xml:space="preserve"> <data name="MainPageLyriscOnly.Content" xml:space="preserve">
<value>僅顯示歌詞</value> <value>僅顯示歌詞</value>
</data> </data>
@@ -396,6 +387,18 @@
<data name="MainPageSplitView.Content" xml:space="preserve"> <data name="MainPageSplitView.Content" xml:space="preserve">
<value>分割檢視</value> <value>分割檢視</value>
</data> </data>
<data name="MediaSettingsControlLastSyncTime.Header" xml:space="preserve">
<value>上次同步時間</value>
</data>
<data name="MediaSettingsControlLocalFolder" xml:space="preserve">
<value>本機資料夾</value>
</data>
<data name="MediaSettingsControlNameSetting.Header" xml:space="preserve">
<value>名稱</value>
</data>
<data name="MediaSettingsControlSyncNow.Content" xml:space="preserve">
<value>立即同步</value>
</data>
<data name="MusicGalleryPageAddToCustomList.Text" xml:space="preserve"> <data name="MusicGalleryPageAddToCustomList.Text" xml:space="preserve">
<value>加入播放清單</value> <value>加入播放清單</value>
</data> </data>
@@ -411,6 +414,12 @@
<data name="MusicGalleryPageAllSongs" xml:space="preserve"> <data name="MusicGalleryPageAllSongs" xml:space="preserve">
<value>所有音樂</value> <value>所有音樂</value>
</data> </data>
<data name="MusicGalleryPageDataSync.Message" xml:space="preserve">
<value>媒體庫同步中...</value>
</data>
<data name="MusicGalleryPageDataSyncError.Message" xml:space="preserve">
<value>媒體庫同步有問題</value>
</data>
<data name="MusicGalleryPageEmptyPlayingQueue.Text" xml:space="preserve"> <data name="MusicGalleryPageEmptyPlayingQueue.Text" xml:space="preserve">
<value>清除播放佇列</value> <value>清除播放佇列</value>
</data> </data>
@@ -420,9 +429,6 @@
<data name="MusicGalleryPageFileArtist.Header" xml:space="preserve"> <data name="MusicGalleryPageFileArtist.Header" xml:space="preserve">
<value>演出者</value> <value>演出者</value>
</data> </data>
<data name="MusicGalleryPageFileInfo.Text" xml:space="preserve">
<value>檔案資訊</value>
</data>
<data name="MusicGalleryPageFileInfoBitDepth.Header" xml:space="preserve"> <data name="MusicGalleryPageFileInfoBitDepth.Header" xml:space="preserve">
<value>位元深度</value> <value>位元深度</value>
</data> </data>
@@ -430,7 +436,7 @@
<value>位元率</value> <value>位元率</value>
</data> </data>
<data name="MusicGalleryPageFileInfoDuration.Header" xml:space="preserve"> <data name="MusicGalleryPageFileInfoDuration.Header" xml:space="preserve">
<value>長</value> <value>長</value>
</data> </data>
<data name="MusicGalleryPageFileInfoEncoder.Header" xml:space="preserve"> <data name="MusicGalleryPageFileInfoEncoder.Header" xml:space="preserve">
<value>編碼器</value> <value>編碼器</value>
@@ -456,15 +462,15 @@
<data name="MusicGalleryPageFileNotFound.Text" xml:space="preserve"> <data name="MusicGalleryPageFileNotFound.Text" xml:space="preserve">
<value>未在媒體櫃內找到任何歌曲</value> <value>未在媒體櫃內找到任何歌曲</value>
</data> </data>
<data name="MusicGalleryPageFolder.Text" xml:space="preserve">
<value>資料夾</value>
</data>
<data name="MusicGalleryPageImportFromFile.Text" xml:space="preserve"> <data name="MusicGalleryPageImportFromFile.Text" xml:space="preserve">
<value>從檔案匯入</value> <value>從檔案匯入</value>
</data> </data>
<data name="MusicGalleryPageNewPlaylist.Text" xml:space="preserve"> <data name="MusicGalleryPageNewPlaylist.Text" xml:space="preserve">
<value>建立播放清單</value> <value>建立播放清單</value>
</data> </data>
<data name="MusicGalleryPagePlayAll.Content" xml:space="preserve">
<value>播放全部</value>
</data>
<data name="MusicGalleryPagePlayingQueue.Text" xml:space="preserve"> <data name="MusicGalleryPagePlayingQueue.Text" xml:space="preserve">
<value>播放佇列</value> <value>播放佇列</value>
</data> </data>
@@ -489,9 +495,6 @@
<data name="MusicGalleryPageScrollToPlayingItem.Text" xml:space="preserve"> <data name="MusicGalleryPageScrollToPlayingItem.Text" xml:space="preserve">
<value>捲動到播放項</value> <value>捲動到播放項</value>
</data> </data>
<data name="MusicGalleryPageSelectAll.Content" xml:space="preserve">
<value>全選</value>
</data>
<data name="MusicGalleryPageSingleLoop.Text" xml:space="preserve"> <data name="MusicGalleryPageSingleLoop.Text" xml:space="preserve">
<value>單曲循環</value> <value>單曲循環</value>
</data> </data>
@@ -513,20 +516,29 @@
<data name="MusicGalleryPageSortType.Text" xml:space="preserve"> <data name="MusicGalleryPageSortType.Text" xml:space="preserve">
<value>排序類型</value> <value>排序類型</value>
</data> </data>
<data name="MusicGalleryPageStarredPlaylist.Content" xml:space="preserve">
<value>已加星號的播放清單</value>
</data>
<data name="MusicGalleryPageStopTrack.Text" xml:space="preserve"> <data name="MusicGalleryPageStopTrack.Text" xml:space="preserve">
<value>停止</value> <value>停止</value>
</data> </data>
<data name="MusicGalleryPageTitle" xml:space="preserve"> <data name="MusicGalleryPageTitle" xml:space="preserve">
<value>音樂庫 - BetterLyrics</value> <value>音樂庫 - BetterLyrics</value>
</data> </data>
<data name="MusicGalleryWindowDownButtonToolTip.Content" xml:space="preserve"> <data name="MusicSettingsControlAutoSyncInterval.Header" xml:space="preserve">
<value>收回</value> <value>自動同步頻率</value>
</data> </data>
<data name="MusicGalleryWindowUpButtonToolTip.Content" xml:space="preserve"> <data name="MusicSettingsControlAutoSyncIntervalDisabled.Content" xml:space="preserve">
<value>展開</value> <value>從不</value>
</data>
<data name="MusicSettingsControlAutoSyncIntervalEveryDay.Content" xml:space="preserve">
<value>每日</value>
</data>
<data name="MusicSettingsControlAutoSyncIntervalEveryFifteenMin.Content" xml:space="preserve">
<value>每 15 分鐘</value>
</data>
<data name="MusicSettingsControlAutoSyncIntervalEveryHour.Content" xml:space="preserve">
<value>每小時</value>
</data>
<data name="MusicSettingsControlAutoSyncIntervalEverySixHrs.Content" xml:space="preserve">
<value>每 6 小時</value>
</data> </data>
<data name="NarrowMode" xml:space="preserve"> <data name="NarrowMode" xml:space="preserve">
<value>窄屏模式</value> <value>窄屏模式</value>
@@ -543,12 +555,27 @@
<data name="PrivacyPolicy.Content" xml:space="preserve"> <data name="PrivacyPolicy.Content" xml:space="preserve">
<value>隱私權政策</value> <value>隱私權政策</value>
</data> </data>
<data name="RemoteServerConfigControlBrowse.Content" xml:space="preserve">
<value>瀏覽</value>
</data>
<data name="RemoteServerConfigControlName.Header" xml:space="preserve">
<value>名稱</value>
</data>
<data name="RemoteServerConfigControlName.PlaceholderText" xml:space="preserve">
<value>留空會自動產生預設名稱。</value>
</data>
<data name="RemoteServerConfigControlPassword.Header" xml:space="preserve"> <data name="RemoteServerConfigControlPassword.Header" xml:space="preserve">
<value>密碼</value> <value>密碼</value>
</data> </data>
<data name="RemoteServerConfigControlPath.Header" xml:space="preserve"> <data name="RemoteServerConfigControlPath.Header" xml:space="preserve">
<value>路徑</value> <value>路徑</value>
</data> </data>
<data name="RemoteServerConfigControlPathNotExisted" xml:space="preserve">
<value>無法找到指定的資料夾路徑</value>
</data>
<data name="RemoteServerConfigControlPathRequired" xml:space="preserve">
<value>需要路徑</value>
</data>
<data name="RemoteServerConfigControlPort.Header" xml:space="preserve"> <data name="RemoteServerConfigControlPort.Header" xml:space="preserve">
<value>連接埠</value> <value>連接埠</value>
</data> </data>
@@ -576,9 +603,6 @@
<data name="SetingsPageFeedback.Text" xml:space="preserve"> <data name="SetingsPageFeedback.Text" xml:space="preserve">
<value>意見反應</value> <value>意見反應</value>
</data> </data>
<data name="SetingsPageInstructions.Text" xml:space="preserve">
<value>操作指南</value>
</data>
<data name="SetingsPageSpecialThanks.Text" xml:space="preserve"> <data name="SetingsPageSpecialThanks.Text" xml:space="preserve">
<value>特別鳴謝</value> <value>特別鳴謝</value>
</data> </data>
@@ -606,9 +630,6 @@
<data name="SettingsPageAddFolderButton.Content" xml:space="preserve"> <data name="SettingsPageAddFolderButton.Content" xml:space="preserve">
<value>新增</value> <value>新增</value>
</data> </data>
<data name="SettingsPageAdvanced.Text" xml:space="preserve">
<value>進階選項</value>
</data>
<data name="SettingsPageAlbum.Header" xml:space="preserve"> <data name="SettingsPageAlbum.Header" xml:space="preserve">
<value>專輯</value> <value>專輯</value>
</data> </data>
@@ -624,15 +645,9 @@
<data name="SettingsPageAlbumArtSearchProvidersConfig.Text" xml:space="preserve"> <data name="SettingsPageAlbumArtSearchProvidersConfig.Text" xml:space="preserve">
<value>配置專輯封面來源</value> <value>配置專輯封面來源</value>
</data> </data>
<data name="SettingsPageAlbumArtSize.Header" xml:space="preserve">
<value>專輯封面大小</value>
</data>
<data name="SettingsPageAlbumEffect.Text" xml:space="preserve"> <data name="SettingsPageAlbumEffect.Text" xml:space="preserve">
<value>專輯封面效果</value> <value>專輯封面效果</value>
</data> </data>
<data name="SettingsPageAlbumLib.Content" xml:space="preserve">
<value>專輯封面來源</value>
</data>
<data name="SettingsPageAlbumRadius.Header" xml:space="preserve"> <data name="SettingsPageAlbumRadius.Header" xml:space="preserve">
<value>圓角半徑</value> <value>圓角半徑</value>
</data> </data>
@@ -663,12 +678,6 @@
<data name="SettingsPageAppAppearance.Text" xml:space="preserve"> <data name="SettingsPageAppAppearance.Text" xml:space="preserve">
<value>應用程式外觀</value> <value>應用程式外觀</value>
</data> </data>
<data name="SettingsPageAppBehavior.Text" xml:space="preserve">
<value>一般行為</value>
</data>
<data name="SettingsPageApply.Content" xml:space="preserve">
<value>套用</value>
</data>
<data name="SettingsPageArtist.Header" xml:space="preserve"> <data name="SettingsPageArtist.Header" xml:space="preserve">
<value>演出者</value> <value>演出者</value>
</data> </data>
@@ -687,21 +696,12 @@
<data name="SettingsPageAutoStart.Header" xml:space="preserve"> <data name="SettingsPageAutoStart.Header" xml:space="preserve">
<value>自動啟動</value> <value>自動啟動</value>
</data> </data>
<data name="SettingsPageAutoStartWindow.Header" xml:space="preserve">
<value>啟動應用程式時</value>
</data>
<data name="SettingsPageBackdrop.Header" xml:space="preserve">
<value>歌詞背景材質</value>
</data>
<data name="SettingsPageBackgroundOverlay.Text" xml:space="preserve"> <data name="SettingsPageBackgroundOverlay.Text" xml:space="preserve">
<value>歌詞背景</value> <value>歌詞背景</value>
</data> </data>
<data name="SettingsPageBlurAmount.Header" xml:space="preserve"> <data name="SettingsPageBlurAmount.Header" xml:space="preserve">
<value>模糊量</value> <value>模糊量</value>
</data> </data>
<data name="SettingsPageBorderless.Header" xml:space="preserve">
<value>無邊框視窗</value>
</data>
<data name="SettingsPageCache.Description" xml:space="preserve"> <data name="SettingsPageCache.Description" xml:space="preserve">
<value>包括記錄檔,網路歌詞快取</value> <value>包括記錄檔,網路歌詞快取</value>
</data> </data>
@@ -738,9 +738,6 @@
<data name="SettingsPageCollapseDropdown.Content" xml:space="preserve"> <data name="SettingsPageCollapseDropdown.Content" xml:space="preserve">
<value>摺疊下拉式清單</value> <value>摺疊下拉式清單</value>
</data> </data>
<data name="SettingsPageCompactTitleBar.Content" xml:space="preserve">
<value>緊湊</value>
</data>
<data name="SettingsPageConfigName.Description" xml:space="preserve"> <data name="SettingsPageConfigName.Description" xml:space="preserve">
<value>命名記錄的視窗狀態可以幫助您更好地區分它們</value> <value>命名記錄的視窗狀態可以幫助您更好地區分它們</value>
</data> </data>
@@ -759,18 +756,12 @@
<data name="SettingsPageCrossfade.Content" xml:space="preserve"> <data name="SettingsPageCrossfade.Content" xml:space="preserve">
<value>交叉淡入淡出</value> <value>交叉淡入淡出</value>
</data> </data>
<data name="SettingsPageCurrentLyricsWindowStatus.Text" xml:space="preserve">
<value>目前歌詞視窗狀態</value>
</data>
<data name="SettingsPageCutletDockerServer.Header" xml:space="preserve"> <data name="SettingsPageCutletDockerServer.Header" xml:space="preserve">
<value>cutlet-docker 音譯服務</value> <value>cutlet-docker 音譯服務</value>
</data> </data>
<data name="SettingsPageDark.Content" xml:space="preserve"> <data name="SettingsPageDark.Content" xml:space="preserve">
<value>深色</value> <value>深色</value>
</data> </data>
<data name="SettingsPageDebugOverlay.Header" xml:space="preserve">
<value>顯示偵錯覆疊層</value>
</data>
<data name="SettingsPageDelete.Text" xml:space="preserve"> <data name="SettingsPageDelete.Text" xml:space="preserve">
<value>刪除</value> <value>刪除</value>
</data> </data>
@@ -801,15 +792,9 @@
<data name="SettingsPageDockPlacementTop.Content" xml:space="preserve"> <data name="SettingsPageDockPlacementTop.Content" xml:space="preserve">
<value>頂部</value> <value>頂部</value>
</data> </data>
<data name="SettingsPageDockWindowHeight.Header" xml:space="preserve">
<value>視窗高度</value>
</data>
<data name="SettingsPageDragArea.Header" xml:space="preserve"> <data name="SettingsPageDragArea.Header" xml:space="preserve">
<value>可拖曳區域</value> <value>可拖曳區域</value>
</data> </data>
<data name="SettingsPageEasingFuncType.Header" xml:space="preserve">
<value>緩動動畫類型</value>
</data>
<data name="SettingsPageEasingTypeEaseInOutBack.Content" xml:space="preserve"> <data name="SettingsPageEasingTypeEaseInOutBack.Content" xml:space="preserve">
<value>回彈緩入緩出</value> <value>回彈緩入緩出</value>
</data> </data>
@@ -873,18 +858,15 @@
<data name="SettingsPageExitOnLyricsWindowClosed.Header" xml:space="preserve"> <data name="SettingsPageExitOnLyricsWindowClosed.Header" xml:space="preserve">
<value>關閉歌詞視窗時結束程式</value> <value>關閉歌詞視窗時結束程式</value>
</data> </data>
<data name="SettingsPageExportPlayHistoryButton.Content" xml:space="preserve">
<value>匯出播放記錄</value>
</data>
<data name="SettingsPageExportSettingsButton.Content" xml:space="preserve"> <data name="SettingsPageExportSettingsButton.Content" xml:space="preserve">
<value>匯出設定</value> <value>匯出設定</value>
</data> </data>
<data name="SettingsPageExtendedTitleBar.Content" xml:space="preserve">
<value>延伸</value>
</data>
<data name="SettingsPageFan.Header" xml:space="preserve"> <data name="SettingsPageFan.Header" xml:space="preserve">
<value>扇形歌詞</value> <value>扇形歌詞</value>
</data> </data>
<data name="SettingsPageFAQ.Content" xml:space="preserve">
<value>常見問題</value>
</data>
<data name="SettingsPageFixedTimeStep.Header" xml:space="preserve"> <data name="SettingsPageFixedTimeStep.Header" xml:space="preserve">
<value>固定時間步長渲染</value> <value>固定時間步長渲染</value>
</data> </data>
@@ -921,9 +903,6 @@
<data name="SettingsPageHeight.Header" xml:space="preserve"> <data name="SettingsPageHeight.Header" xml:space="preserve">
<value>高度</value> <value>高度</value>
</data> </data>
<data name="SettingsPageHello.Text" xml:space="preserve">
<value>您好</value>
</data>
<data name="SettingsPageHelpUsTranslate.Content" xml:space="preserve"> <data name="SettingsPageHelpUsTranslate.Content" xml:space="preserve">
<value>幫助我們翻譯此應用程式</value> <value>幫助我們翻譯此應用程式</value>
</data> </data>
@@ -954,9 +933,6 @@
<data name="SettingsPageJapanese.Header" xml:space="preserve"> <data name="SettingsPageJapanese.Header" xml:space="preserve">
<value>日語注音</value> <value>日語注音</value>
</data> </data>
<data name="SettingsPageJoinNowButton.Content" xml:space="preserve">
<value>立即加入</value>
</data>
<data name="SettingsPageJyutping.Content" xml:space="preserve"> <data name="SettingsPageJyutping.Content" xml:space="preserve">
<value>粵語拼音</value> <value>粵語拼音</value>
</data> </data>
@@ -1005,18 +981,12 @@
<data name="SettingsPageLight.Content" xml:space="preserve"> <data name="SettingsPageLight.Content" xml:space="preserve">
<value>淺色</value> <value>淺色</value>
</data> </data>
<data name="SettingsPageLinkedFile.Text" xml:space="preserve">
<value>連結的本機檔案</value>
</data>
<data name="SettingsPageListenNewSession.Header" xml:space="preserve"> <data name="SettingsPageListenNewSession.Header" xml:space="preserve">
<value>啟用對新播放來源的監聽</value> <value>啟用對新播放來源的監聽</value>
</data> </data>
<data name="SettingsPageLocalFolder.Text" xml:space="preserve"> <data name="SettingsPageLocalFolder.Text" xml:space="preserve">
<value>本機資料夾</value> <value>本機資料夾</value>
</data> </data>
<data name="SettingsPageLog.Header" xml:space="preserve">
<value>記錄檔記錄</value>
</data>
<data name="SettingsPageLongSyllableDuration.Header" xml:space="preserve"> <data name="SettingsPageLongSyllableDuration.Header" xml:space="preserve">
<value>長音節閾值</value> <value>長音節閾值</value>
</data> </data>
@@ -1071,15 +1041,6 @@
<data name="SettingsPageLyricsFgFontColor.Header" xml:space="preserve"> <data name="SettingsPageLyricsFgFontColor.Header" xml:space="preserve">
<value>目前行</value> <value>目前行</value>
</data> </data>
<data name="SettingsPageLyricsFgFontColorAdaptiveColored.Content" xml:space="preserve">
<value>適應歌詞背景(彩色)</value>
</data>
<data name="SettingsPageLyricsFgFontColorAdaptiveGrayed.Content" xml:space="preserve">
<value>適應歌詞背景(灰色)</value>
</data>
<data name="SettingsPageLyricsFgFontColorCustom.Content" xml:space="preserve">
<value>自訂</value>
</data>
<data name="SettingsPageLyricsFloatAnimation.Header" xml:space="preserve"> <data name="SettingsPageLyricsFloatAnimation.Header" xml:space="preserve">
<value>浮動動畫</value> <value>浮動動畫</value>
</data> </data>
@@ -1107,27 +1068,12 @@
<data name="SettingsPageLyricsGlowEffect.Header" xml:space="preserve"> <data name="SettingsPageLyricsGlowEffect.Header" xml:space="preserve">
<value>發光效果</value> <value>發光效果</value>
</data> </data>
<data name="SettingsPageLyricsHighlight.Header" xml:space="preserve">
<value>醒目提示</value>
</data>
<data name="SettingsPageLyricsHighlightScope.Header" xml:space="preserve">
<value>原文醒目提示範圍</value>
</data>
<data name="SettingsPageLyricsLeft.Content" xml:space="preserve">
<value>靠左</value>
</data>
<data name="SettingsPageLyricsLight.Content" xml:space="preserve"> <data name="SettingsPageLyricsLight.Content" xml:space="preserve">
<value>細體</value> <value>細體</value>
</data> </data>
<data name="SettingsPageLyricsLineFade.Header" xml:space="preserve">
<value>播放區域邊緣漸變</value>
</data>
<data name="SettingsPageLyricsLineSpacingFactor.Header" xml:space="preserve"> <data name="SettingsPageLyricsLineSpacingFactor.Header" xml:space="preserve">
<value>行間距</value> <value>行間距</value>
</data> </data>
<data name="SettingsPageLyricsLineSpacingFactorUnit.Text" xml:space="preserve">
<value> 倍行高</value>
</data>
<data name="SettingsPageLyricsMedium.Content" xml:space="preserve"> <data name="SettingsPageLyricsMedium.Content" xml:space="preserve">
<value>中等</value> <value>中等</value>
</data> </data>
@@ -1170,9 +1116,6 @@
<data name="SettingsPageLyricsSemiLight.Content" xml:space="preserve"> <data name="SettingsPageLyricsSemiLight.Content" xml:space="preserve">
<value>次細</value> <value>次細</value>
</data> </data>
<data name="SettingsPageLyricsShadow.Header" xml:space="preserve">
<value>陰影</value>
</data>
<data name="SettingsPageLyricsStyle.Text" xml:space="preserve"> <data name="SettingsPageLyricsStyle.Text" xml:space="preserve">
<value>歌詞樣式</value> <value>歌詞樣式</value>
</data> </data>
@@ -1188,30 +1131,15 @@
<data name="SettingsPageLyricsTimelineThreshold.Header" xml:space="preserve"> <data name="SettingsPageLyricsTimelineThreshold.Header" xml:space="preserve">
<value>歌詞時間軸同步閾值</value> <value>歌詞時間軸同步閾值</value>
</data> </data>
<data name="SettingsPageLyricsTranslationHighlight.Header" xml:space="preserve">
<value>翻譯醒目提示</value>
</data>
<data name="SettingsPageLyricsTranslationSeparator.Header" xml:space="preserve">
<value>原文譯文分隔符號</value>
</data>
<data name="SettingsPageLyricsVerticalEdgeOpacity.Header" xml:space="preserve">
<value>上下邊緣不透明度</value>
</data>
<data name="SettingsPageLyricsWindow.Text" xml:space="preserve"> <data name="SettingsPageLyricsWindow.Text" xml:space="preserve">
<value>歌詞視窗</value> <value>歌詞視窗</value>
</data> </data>
<data name="SettingsPageLyricsWindowManager.Text" xml:space="preserve">
<value>歌詞視窗管理器</value>
</data>
<data name="SettingsPageLyricsWindowMgr.Content" xml:space="preserve"> <data name="SettingsPageLyricsWindowMgr.Content" xml:space="preserve">
<value>歌詞視窗管理器</value> <value>歌詞視窗管理器</value>
</data> </data>
<data name="SettingsPageLyricsWindowSwitchHotKey.Header" xml:space="preserve"> <data name="SettingsPageLyricsWindowSwitchHotKey.Header" xml:space="preserve">
<value>歌詞視窗狀態切換快速鍵</value> <value>歌詞視窗狀態切換快速鍵</value>
</data> </data>
<data name="SettingsPageLyricsWindowToolTip.Content" xml:space="preserve">
<value>歌詞視窗</value>
</data>
<data name="SettingsPageMatchingThreshold.Description" xml:space="preserve"> <data name="SettingsPageMatchingThreshold.Description" xml:space="preserve">
<value>調整此值將影響順序搜尋和最佳符合搜尋結果,但不會影響手動歌詞搜尋介面中的搜尋結果</value> <value>調整此值將影響順序搜尋和最佳符合搜尋結果,但不會影響手動歌詞搜尋介面中的搜尋結果</value>
</data> </data>
@@ -1248,18 +1176,12 @@
<data name="SettingsPageMusicLib.Header" xml:space="preserve"> <data name="SettingsPageMusicLib.Header" xml:space="preserve">
<value>本機媒體櫃</value> <value>本機媒體櫃</value>
</data> </data>
<data name="SettingsPageMusicLibRealTimeWatch.Header" xml:space="preserve">
<value>即時監聽檔案變化</value>
</data>
<data name="SettingsPageNarrowMode.Text" xml:space="preserve"> <data name="SettingsPageNarrowMode.Text" xml:space="preserve">
<value>窄屏模式</value> <value>窄屏模式</value>
</data> </data>
<data name="SettingsPageNextSongHotKey.Header" xml:space="preserve"> <data name="SettingsPageNextSongHotKey.Header" xml:space="preserve">
<value>下一曲目快速鍵</value> <value>下一曲目快速鍵</value>
</data> </data>
<data name="SettingsPageNoBackdrop.Content" xml:space="preserve">
<value>無</value>
</data>
<data name="SettingsPageOctTree.Content" xml:space="preserve"> <data name="SettingsPageOctTree.Content" xml:space="preserve">
<value>激進</value> <value>激進</value>
</data> </data>
@@ -1287,9 +1209,6 @@
<data name="SettingsPagePathIncludingOthersInfo" xml:space="preserve"> <data name="SettingsPagePathIncludingOthersInfo" xml:space="preserve">
<value>該資料夾包含已新增資料夾,請刪除這些資料夾以新增該資料夾</value> <value>該資料夾包含已新增資料夾,請刪除這些資料夾以新增該資料夾</value>
</data> </data>
<data name="SettingsPagePathNotFound.Text" xml:space="preserve">
<value>無法在您的電腦中找到該路徑</value>
</data>
<data name="SettingsPagePatrons.Text" xml:space="preserve"> <data name="SettingsPagePatrons.Text" xml:space="preserve">
<value>贊助</value> <value>贊助</value>
</data> </data>
@@ -1335,15 +1254,9 @@
<data name="SettingsPageRealtimeStatus.Text" xml:space="preserve"> <data name="SettingsPageRealtimeStatus.Text" xml:space="preserve">
<value>即時狀態</value> <value>即時狀態</value>
</data> </data>
<data name="SettingsPageRecord.Content" xml:space="preserve">
<value>記錄</value>
</data>
<data name="SettingsPageRecordedWindowStatus.Text" xml:space="preserve"> <data name="SettingsPageRecordedWindowStatus.Text" xml:space="preserve">
<value>記錄的視窗狀態</value> <value>記錄的視窗狀態</value>
</data> </data>
<data name="SettingsPageReference.Header" xml:space="preserve">
<value>參考連結</value>
</data>
<data name="SettingsPageRefreshDropdown.Content" xml:space="preserve"> <data name="SettingsPageRefreshDropdown.Content" xml:space="preserve">
<value>重新整理下拉式清單</value> <value>重新整理下拉式清單</value>
</data> </data>
@@ -1362,9 +1275,6 @@
<data name="SettingsPageRight.Content" xml:space="preserve"> <data name="SettingsPageRight.Content" xml:space="preserve">
<value>靠右</value> <value>靠右</value>
</data> </data>
<data name="SettingsPageRomaji.Header" xml:space="preserve">
<value>日語注音</value>
</data>
<data name="SettingsPageScope.Header" xml:space="preserve"> <data name="SettingsPageScope.Header" xml:space="preserve">
<value>範圍</value> <value>範圍</value>
</data> </data>
@@ -1404,6 +1314,9 @@
<data name="SettingsPageSettingsManager.Header" xml:space="preserve"> <data name="SettingsPageSettingsManager.Header" xml:space="preserve">
<value>設定管理器</value> <value>設定管理器</value>
</data> </data>
<data name="SettingsPageSettingsPlayHistory.Header" xml:space="preserve">
<value>播放記錄</value>
</data>
<data name="SettingsPageShareHub.Content" xml:space="preserve"> <data name="SettingsPageShareHub.Content" xml:space="preserve">
<value>瀏覽線上資源共享中心</value> <value>瀏覽線上資源共享中心</value>
</data> </data>
@@ -1431,18 +1344,12 @@
<data name="SettingsPageShowInSwitchers.Header" xml:space="preserve"> <data name="SettingsPageShowInSwitchers.Header" xml:space="preserve">
<value>在系統環境中顯示</value> <value>在系統環境中顯示</value>
</data> </data>
<data name="SettingsPageShowLayoutDragger.Header" xml:space="preserve">
<value>顯示版面配置拆分器</value>
</data>
<data name="SettingsPageShowTitle.Header" xml:space="preserve"> <data name="SettingsPageShowTitle.Header" xml:space="preserve">
<value>顯示標題</value> <value>顯示標題</value>
</data> </data>
<data name="SettingsPageSlide.Content" xml:space="preserve"> <data name="SettingsPageSlide.Content" xml:space="preserve">
<value>滑動</value> <value>滑動</value>
</data> </data>
<data name="SettingsPageSliderPrefix.Text" xml:space="preserve">
<value>目前值: </value>
</data>
<data name="SettingsPageSnowFlakeLayer.Header" xml:space="preserve"> <data name="SettingsPageSnowFlakeLayer.Header" xml:space="preserve">
<value>雪花層</value> <value>雪花層</value>
</data> </data>
@@ -1485,6 +1392,9 @@
<data name="SettingsPageStartup.Text" xml:space="preserve"> <data name="SettingsPageStartup.Text" xml:space="preserve">
<value>啟動</value> <value>啟動</value>
</data> </data>
<data name="SettingsPageStats.Content" xml:space="preserve">
<value>統計資料</value>
</data>
<data name="SettingsPageStopTrackOnGalleryWindowClosed.Header" xml:space="preserve"> <data name="SettingsPageStopTrackOnGalleryWindowClosed.Header" xml:space="preserve">
<value>關閉音樂庫視窗時停止播放</value> <value>關閉音樂庫視窗時停止播放</value>
</data> </data>
@@ -1503,9 +1413,6 @@
<data name="SettingsPageTaskbarPlacement.Header" xml:space="preserve"> <data name="SettingsPageTaskbarPlacement.Header" xml:space="preserve">
<value>工作列固定位置</value> <value>工作列固定位置</value>
</data> </data>
<data name="SettingsPageThanksForPurchasing.Text" xml:space="preserve">
<value>感謝您購買 BetterLyrics</value>
</data>
<data name="SettingsPageThanksList.Header" xml:space="preserve"> <data name="SettingsPageThanksList.Header" xml:space="preserve">
<value>致謝名單</value> <value>致謝名單</value>
</data> </data>
@@ -1524,12 +1431,6 @@
<data name="SettingsPageTitleBarAreaWhole.Content" xml:space="preserve"> <data name="SettingsPageTitleBarAreaWhole.Content" xml:space="preserve">
<value>整個視窗</value> <value>整個視窗</value>
</data> </data>
<data name="SettingsPageTitleBarType.Header" xml:space="preserve">
<value>標題列大小</value>
</data>
<data name="SettingsPageToggleHotKey.Header" xml:space="preserve">
<value>切入與切出快速鍵</value>
</data>
<data name="SettingsPageTranslatedText.Header" xml:space="preserve"> <data name="SettingsPageTranslatedText.Header" xml:space="preserve">
<value>譯文</value> <value>譯文</value>
</data> </data>
@@ -1539,9 +1440,6 @@
<data name="SettingsPageTranslationConfig.Header" xml:space="preserve"> <data name="SettingsPageTranslationConfig.Header" xml:space="preserve">
<value>LibreTranslate 翻譯服務</value> <value>LibreTranslate 翻譯服務</value>
</data> </data>
<data name="SettingsPageTranslationInfoLink.Text" xml:space="preserve">
<value>訪問 https://github.com/LibreTranslate/LibreTranslate 獲取安裝教學及更多資訊(本軟體與該翻譯服務無任何聯繫)</value>
</data>
<data name="SettingsPageUserWhoPurchased.Text" xml:space="preserve"> <data name="SettingsPageUserWhoPurchased.Text" xml:space="preserve">
<value>以及購買支援 BetterLyrics 的使用者</value> <value>以及購買支援 BetterLyrics 的使用者</value>
</data> </data>
@@ -1554,9 +1452,6 @@
<data name="SettingsPageWidth.Header" xml:space="preserve"> <data name="SettingsPageWidth.Header" xml:space="preserve">
<value>寬度</value> <value>寬度</value>
</data> </data>
<data name="SettingsPageWindowBounds.Header" xml:space="preserve">
<value>視窗邊框</value>
</data>
<data name="SettingsPageWorkArea.Description" xml:space="preserve"> <data name="SettingsPageWorkArea.Description" xml:space="preserve">
<value>作為一個單獨的工作區,停靠到螢幕上/下邊緣</value> <value>作為一個單獨的工作區,停靠到螢幕上/下邊緣</value>
</data> </data>
@@ -1572,6 +1467,39 @@
<data name="StandardMode" xml:space="preserve"> <data name="StandardMode" xml:space="preserve">
<value>標準模式</value> <value>標準模式</value>
</data> </data>
<data name="StatsDashboardControlSources.Text" xml:space="preserve">
<value>來源</value>
</data>
<data name="StatsDashboardControlThisMonth.Header" xml:space="preserve">
<value>本月</value>
</data>
<data name="StatsDashboardControlThisQuarter.Header" xml:space="preserve">
<value>本季</value>
</data>
<data name="StatsDashboardControlThisWeek.Header" xml:space="preserve">
<value>本週</value>
</data>
<data name="StatsDashboardControlThisYear.Header" xml:space="preserve">
<value>今年</value>
</data>
<data name="StatsDashboardControlToday.Header" xml:space="preserve">
<value>今天</value>
</data>
<data name="StatsDashboardControlTopArtists.Text" xml:space="preserve">
<value>頂級藝術家</value>
</data>
<data name="StatsDashboardControlTopSongs.Text" xml:space="preserve">
<value>熱門曲目</value>
</data>
<data name="StatsDashboardControlTopSource.Text" xml:space="preserve">
<value>頂端來源</value>
</data>
<data name="StatsDashboardControlTotalDuration.Text" xml:space="preserve">
<value>總時間</value>
</data>
<data name="StatsDashboardControlTracksPlayed.Text" xml:space="preserve">
<value>播放曲目</value>
</data>
<data name="SystemTrayExit.Text" xml:space="preserve"> <data name="SystemTrayExit.Text" xml:space="preserve">
<value>結束程式</value> <value>結束程式</value>
</data> </data>
@@ -1581,9 +1509,6 @@
<data name="SystemTrayMusicGallery.Text" xml:space="preserve"> <data name="SystemTrayMusicGallery.Text" xml:space="preserve">
<value>開啟音樂庫</value> <value>開啟音樂庫</value>
</data> </data>
<data name="SystemTrayPageTitle" xml:space="preserve">
<value>系統匣 - BetterLyrics</value>
</data>
<data name="SystemTrayResetWindowPosition.Text" xml:space="preserve"> <data name="SystemTrayResetWindowPosition.Text" xml:space="preserve">
<value>重設視窗位置</value> <value>重設視窗位置</value>
</data> </data>

View File

@@ -8,6 +8,7 @@ using CommunityToolkit.Mvvm.ComponentModel;
using CommunityToolkit.Mvvm.Input; using CommunityToolkit.Mvvm.Input;
using Microsoft.UI.Xaml.Controls; using Microsoft.UI.Xaml.Controls;
using System; using System;
using System.IO;
using System.Threading.Tasks; using System.Threading.Tasks;
namespace BetterLyrics.WinUI3.ViewModels namespace BetterLyrics.WinUI3.ViewModels
@@ -74,6 +75,19 @@ namespace BetterLyrics.WinUI3.ViewModels
} }
} }
[RelayCommand]
private async Task ExportPlayHistoryAsync()
{
var folder = await PickerHelper.PickSingleFolderAsync<SettingsWindow>();
if (folder != null)
{
var dest = Path.Combine(folder.Path, $"BetterLyrics_Play_History_Export_{DateTime.Now:yyyyMMdd_HHmmss}.db");
await FileHelper.CopyFileAsync(PathHelper.PlayHistoryPath, dest);
ToastHelper.ShowToast("ExportSettingsSuccess", null, InfoBarSeverity.Success);
}
}
[RelayCommand] [RelayCommand]
private void ClearCacheFiles() private void ClearCacheFiles()
{ {

View File

@@ -1,19 +1,24 @@
using BetterLyrics.WinUI3.Controls; using BetterLyrics.WinUI3.Controls;
using BetterLyrics.WinUI3.Enums;
using BetterLyrics.WinUI3.Helper; using BetterLyrics.WinUI3.Helper;
using BetterLyrics.WinUI3.Hooks; using BetterLyrics.WinUI3.Hooks;
using BetterLyrics.WinUI3.Models; using BetterLyrics.WinUI3.Models;
using BetterLyrics.WinUI3.Models.Settings; using BetterLyrics.WinUI3.Models.Settings;
using BetterLyrics.WinUI3.Services.FileSystemService;
using BetterLyrics.WinUI3.Services.LocalizationService; using BetterLyrics.WinUI3.Services.LocalizationService;
using BetterLyrics.WinUI3.Services.SettingsService; using BetterLyrics.WinUI3.Services.SettingsService;
using BetterLyrics.WinUI3.Views; using BetterLyrics.WinUI3.Views;
using CommunityToolkit.Mvvm.ComponentModel; using CommunityToolkit.Mvvm.ComponentModel;
using CommunityToolkit.Mvvm.Input; using CommunityToolkit.Mvvm.Input;
using CommunityToolkit.WinUI.Animations;
using Microsoft.UI.Xaml; using Microsoft.UI.Xaml;
using Microsoft.UI.Xaml.Controls; using Microsoft.UI.Xaml.Controls;
using System; using System;
using System.IO; using System.IO;
using System.Linq; using System.Linq;
using System.Threading;
using System.Threading.Tasks; using System.Threading.Tasks;
using static Vanara.PInvoke.Shell32;
namespace BetterLyrics.WinUI3.ViewModels namespace BetterLyrics.WinUI3.ViewModels
{ {
@@ -21,125 +26,214 @@ namespace BetterLyrics.WinUI3.ViewModels
{ {
private readonly ISettingsService _settingsService; private readonly ISettingsService _settingsService;
private readonly ILocalizationService _localizationService; private readonly ILocalizationService _localizationService;
private readonly IFileSystemService _fileSystemService;
[ObservableProperty] [ObservableProperty] public partial AppSettings AppSettings { get; set; }
public partial AppSettings AppSettings { get; set; }
public MediaSettingsControlViewModel(ISettingsService settingsService, ILocalizationService localizationService) public MediaSettingsControlViewModel(ISettingsService settingsService, ILocalizationService localizationService, IFileSystemService fileSystemService)
{ {
_localizationService = localizationService; _localizationService = localizationService;
_settingsService = settingsService; _settingsService = settingsService;
_fileSystemService = fileSystemService;
AppSettings = _settingsService.AppSettings; AppSettings = _settingsService.AppSettings;
} }
private void AddFolderAsync(string path) public void RemoveFolder(MediaFolder folder)
{ {
var normalizedPath = Path.GetFullPath(path).TrimEnd(Path.DirectorySeparatorChar) + Path.DirectorySeparatorChar; _ = Task.Run(async () =>
if (AppSettings.LocalMediaFolders.Any(x => Path.GetFullPath(x.Path).TrimEnd(Path.DirectorySeparatorChar).Equals(normalizedPath.TrimEnd(Path.DirectorySeparatorChar), StringComparison.OrdinalIgnoreCase)))
{ {
ToastHelper.ShowToast("SettingsPagePathExistedInfo", null, InfoBarSeverity.Warning); await _fileSystemService.DeleteCacheForMediaFolderAsync(folder);
} _dispatcherQueue.TryEnqueue(() =>
else if (AppSettings.LocalMediaFolders.Any(item => normalizedPath.StartsWith(Path.GetFullPath(item.Path).TrimEnd(Path.DirectorySeparatorChar) + Path.DirectorySeparatorChar, StringComparison.OrdinalIgnoreCase))) {
{ AppSettings.LocalMediaFolders.Remove(folder);
// 添加的文件夹是现有文件夹的子文件夹 });
ToastHelper.ShowToast("SettingsPagePathBeIncludedInfo", null, InfoBarSeverity.Warning); });
}
else if (AppSettings.LocalMediaFolders.Any(item => Path.GetFullPath(item.Path).TrimEnd(Path.DirectorySeparatorChar).StartsWith(normalizedPath, StringComparison.OrdinalIgnoreCase))
)
{
// 添加的文件夹是现有文件夹的父文件夹
ToastHelper.ShowToast("SettingsPagePathIncludingOthersInfo", null, InfoBarSeverity.Warning);
}
else
{
AppSettings.LocalMediaFolders.Add(new MediaFolder(path));
}
} }
public void RemoveFolderAsync(MediaFolder folder) public void SyncFolder(MediaFolder folder)
{ {
AppSettings.LocalMediaFolders.Remove(folder); if (folder.IsProcessing) return;
_ = Task.Run(async () => await _fileSystemService.ScanMediaFolderAsync(folder, CancellationToken.None));
} }
[RelayCommand] [RelayCommand]
private async Task SelectAndAddFolderAsync(UIElement sender) private async Task AddMediaSourceAsync(string fileSourceTypeName)
{ {
var folder = await PickerHelper.PickSingleFolderAsync<SettingsWindow>(); FileSourceType fileSourceType = Enum.Parse<FileSourceType>(fileSourceTypeName);
if (folder != null)
{
AddFolderAsync(folder.Path);
}
}
[RelayCommand]
private async Task AddRemoteSourceAsync(string protocolType)
{
var dialog = new ContentDialog var dialog = new ContentDialog
{ {
XamlRoot = WindowHook.GetWindow<SettingsWindow>()?.Content.XamlRoot, XamlRoot = WindowHook.GetWindow<SettingsWindow>()?.Content.XamlRoot,
Style = Application.Current.Resources["DefaultContentDialogStyle"] as Style, Style = Application.Current.Resources["DefaultContentDialogStyle"] as Style,
Title = protocolType, Title = fileSourceType == FileSourceType.Local ? _localizationService.GetLocalizedString("MediaSettingsControlLocalFolder") : Enum.GetName(fileSourceType),
PrimaryButtonText = _localizationService.GetLocalizedString("Add"), PrimaryButtonText = _localizationService.GetLocalizedString("Add"),
CloseButtonText = _localizationService.GetLocalizedString("Cancel"), CloseButtonText = _localizationService.GetLocalizedString("Cancel"),
DefaultButton = ContentDialogButton.Primary, DefaultButton = ContentDialogButton.Primary,
Content = new RemoteServerConfigControl(protocolType) Content = new RemoteServerConfigControl(fileSourceType)
}; };
dialog.PrimaryButtonClick += async (s, e) => dialog.PrimaryButtonClick += async (s, e) =>
{ {
var configControl = (RemoteServerConfigControl)dialog.Content; var configControl = (RemoteServerConfigControl)dialog.Content;
var deferral = e.GetDeferral();
e.Cancel = true; // 默认阻止关闭,直到验证通过
dialog.IsPrimaryButtonEnabled = false;
configControl.IsEnabled = false;
configControl.SetProgressBarVisibility(Visibility.Visible);
// 清除之前的错误信息
configControl.ShowError(null);
try try
{ {
e.Cancel = true;
dialog.IsPrimaryButtonEnabled = false;
configControl.IsEnabled = false;
configControl.SetProgressBarVisibility(Visibility.Visible);
var tempFolder = configControl.GetConfig(); var tempFolder = configControl.GetConfig();
var provider = tempFolder.CreateFileSystem(); if (fileSourceType == FileSourceType.Local)
bool isConnected = provider != null && await provider.ConnectAsync();
if (isConnected)
{ {
await provider!.DisconnectAsync(); string path = tempFolder.UriPath;
if (!Directory.Exists(path))
{
throw new DirectoryNotFoundException(_localizationService.GetLocalizedString("RemoteServerConfigControlPathNotExisted"));
}
var normalizedPath = Path.GetFullPath(path).TrimEnd(Path.DirectorySeparatorChar) + Path.DirectorySeparatorChar;
// 是否完全重复
if (AppSettings.LocalMediaFolders.Any(x => Path.GetFullPath(x.UriPath).TrimEnd(Path.DirectorySeparatorChar).Equals(normalizedPath.TrimEnd(Path.DirectorySeparatorChar), StringComparison.OrdinalIgnoreCase)))
{
configControl.ShowError(_localizationService.GetLocalizedString("SettingsPagePathExistedInfo"));
deferral.Complete();
return;
}
// 是否是子文件夹
else if (AppSettings.LocalMediaFolders.Any(item => normalizedPath.StartsWith(Path.GetFullPath(item.UriPath).TrimEnd(Path.DirectorySeparatorChar) + Path.DirectorySeparatorChar, StringComparison.OrdinalIgnoreCase)))
{
configControl.ShowError(_localizationService.GetLocalizedString("SettingsPagePathBeIncludedInfo"));
deferral.Complete();
return;
}
// 是否是父文件夹
else if (AppSettings.LocalMediaFolders.Any(item => Path.GetFullPath(item.UriPath).TrimEnd(Path.DirectorySeparatorChar).StartsWith(normalizedPath, StringComparison.OrdinalIgnoreCase)))
{
configControl.ShowError(_localizationService.GetLocalizedString("SettingsPagePathIncludingOthersInfo"));
deferral.Complete();
return;
}
PasswordVaultHelper.Save(Constants.App.AppName, tempFolder.VaultKey, tempFolder.Password);
AppSettings.LocalMediaFolders.Add(tempFolder); AppSettings.LocalMediaFolders.Add(tempFolder);
_ = Task.Run(async () => await _fileSystemService.ScanMediaFolderAsync(tempFolder));
e.Cancel = false; e.Cancel = false; // 允许关闭
} }
else else
{ {
ShowErrorTip(configControl, _localizationService.GetLocalizedString("SettingsPageServerTestFailedInfo")); if (fileSourceType == FileSourceType.WebDAV)
{
// 使用辅助类探测协议
string? detectedScheme = await WebDavProbeHelper.DetectSchemeAsync(
tempFolder.UriHost,
tempFolder.UriPort,
tempFolder.UriPath,
tempFolder.UserName,
tempFolder.Password
);
if (detectedScheme == null)
{
// 探测失败,直接报错返回
configControl.ShowError(_localizationService.GetLocalizedString("SettingsPageServerTestFailedInfo"));
deferral.Complete();
return;
}
// 将探测到的正确协议 (http 或 https) 写入配置对象
tempFolder.UriScheme = detectedScheme;
}
var newUriString = tempFolder.GetStandardUri().AbsoluteUri.TrimEnd('/') + "/";
foreach (var existingFolder in AppSettings.LocalMediaFolders)
{
// 只比对同类型的远程源 (可选,或者是比对所有源)
// 这里建议比对所有,防止逻辑上的冲突
var existingUriString = existingFolder.GetStandardUri().AbsoluteUri.TrimEnd('/') + "/";
// 是否完全重复 (忽略大小写)
if (newUriString.Equals(existingUriString, StringComparison.OrdinalIgnoreCase))
{
configControl.ShowError(_localizationService.GetLocalizedString("SettingsPagePathExistedInfo"));
deferral.Complete();
return;
}
// 新路径是否是现有路径的“子文件夹”
if (newUriString.StartsWith(existingUriString, StringComparison.OrdinalIgnoreCase))
{
configControl.ShowError(_localizationService.GetLocalizedString("SettingsPagePathBeIncludedInfo"));
deferral.Complete();
return;
}
// 新路径是否是现有路径的“父文件夹”
if (existingUriString.StartsWith(newUriString, StringComparison.OrdinalIgnoreCase))
{
configControl.ShowError(_localizationService.GetLocalizedString("SettingsPagePathIncludingOthersInfo"));
deferral.Complete();
return;
}
}
bool isConnected = await Task.Run(async () =>
{
try
{
using var provider = tempFolder.CreateFileSystem();
if (provider == null) return false;
return await provider.ConnectAsync();
}
catch (Exception ex)
{
System.Diagnostics.Debug.WriteLine(ex);
return false;
}
});
if (isConnected)
{
AppSettings.LocalMediaFolders.Add(tempFolder);
PasswordVaultHelper.Save(Constants.App.AppName, tempFolder.VaultKey, tempFolder.Password);
_ = Task.Run(async () => await _fileSystemService.ScanMediaFolderAsync(tempFolder));
e.Cancel = false; // 允许关闭
}
else
{
configControl.ShowError(_localizationService.GetLocalizedString("SettingsPageServerTestFailedInfo"));
}
} }
} }
catch (Exception ex) catch (Exception ex)
{ {
ShowErrorTip(configControl, ex.Message); configControl.ShowError(ex.Message);
} }
finally finally
{ {
dialog.IsPrimaryButtonEnabled = true; if (e.Cancel)
configControl.IsEnabled = true; {
configControl.SetProgressBarVisibility(Visibility.Collapsed); dialog.IsPrimaryButtonEnabled = true;
configControl.IsEnabled = true;
configControl.SetProgressBarVisibility(Visibility.Collapsed);
}
} }
deferral.Complete();
}; };
await dialog.ShowAsync(); await dialog.ShowAsync();
} }
private void ShowErrorTip(RemoteServerConfigControl control, string message)
{
// 你可以在 RemoteServerConfigControl 里加一个 InfoBar 用来显示错误
// 假设你在 UserControl 里公开了一个 ShowError 方法
control.ShowError(message);
}
} }
} }

View File

@@ -5,18 +5,21 @@ using BetterLyrics.WinUI3.Extensions;
using BetterLyrics.WinUI3.Helper; using BetterLyrics.WinUI3.Helper;
using BetterLyrics.WinUI3.Models; using BetterLyrics.WinUI3.Models;
using BetterLyrics.WinUI3.Models.Settings; using BetterLyrics.WinUI3.Models.Settings;
using BetterLyrics.WinUI3.Services.LibWatcherService; using BetterLyrics.WinUI3.Services.FileSystemService;
using BetterLyrics.WinUI3.Services.LocalizationService; using BetterLyrics.WinUI3.Services.LocalizationService;
using BetterLyrics.WinUI3.Services.SettingsService; using BetterLyrics.WinUI3.Services.SettingsService;
using BetterLyrics.WinUI3.Views; using BetterLyrics.WinUI3.Views;
using CommunityToolkit.Mvvm.ComponentModel; using CommunityToolkit.Mvvm.ComponentModel;
using CommunityToolkit.Mvvm.Input; using CommunityToolkit.Mvvm.Input;
using CommunityToolkit.Mvvm.Messaging;
using CommunityToolkit.Mvvm.Messaging.Messages;
using CommunityToolkit.WinUI; using CommunityToolkit.WinUI;
using Microsoft.UI.Dispatching; using Microsoft.UI.Dispatching;
using Microsoft.UI.Xaml.Controls; using Microsoft.UI.Xaml.Controls;
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Collections.ObjectModel; using System.Collections.ObjectModel;
using System.Diagnostics;
using System.IO; using System.IO;
using System.Linq; using System.Linq;
using System.Threading.Tasks; using System.Threading.Tasks;
@@ -25,14 +28,18 @@ using Windows.Media;
using Windows.Media.Core; using Windows.Media.Core;
using Windows.Media.Playback; using Windows.Media.Playback;
using Windows.Storage; using Windows.Storage;
using Windows.Storage.Streams;
namespace BetterLyrics.WinUI3.ViewModels namespace BetterLyrics.WinUI3.ViewModels
{ {
public partial class MusicGalleryPageViewModel : BaseViewModel public partial class MusicGalleryPageViewModel : BaseViewModel,
IRecipient<PropertyChangedMessage<DateTime?>>,
IRecipient<PropertyChangedMessage<bool>>,
IRecipient<PropertyChangedMessage<string>>
{ {
private readonly ILibWatcherService _libWatcherService;
private readonly ISettingsService _settingsService; private readonly ISettingsService _settingsService;
private readonly ILocalizationService _localizationService; private readonly ILocalizationService _localizationService;
private readonly IFileSystemService _fileSystemService;
private readonly MediaPlayer _mediaPlayer = new(); private readonly MediaPlayer _mediaPlayer = new();
private readonly MediaTimelineController _timelineController = new(); private readonly MediaTimelineController _timelineController = new();
@@ -40,10 +47,14 @@ namespace BetterLyrics.WinUI3.ViewModels
private readonly DispatcherQueueTimer _refreshSongsTimer; private readonly DispatcherQueueTimer _refreshSongsTimer;
private IRandomAccessStream? _currentStream;
private Stream? _currentNetStream;
private IUnifiedFileSystem? _currentProvider;
// All songs // All songs
private List<ExtendedTrack> _tracks = []; private List<ExtendedTrack> _allTracks = [];
// Songs in current playlist // Songs in current playlist or songs in current file tree
private List<ExtendedTrack> _playlistTracks = []; private List<ExtendedTrack> _middleTracks = [];
// Filtered songs based on search query for current playlist // Filtered songs based on search query for current playlist
private List<ExtendedTrack> _filteredTracks = []; private List<ExtendedTrack> _filteredTracks = [];
@@ -76,26 +87,30 @@ namespace BetterLyrics.WinUI3.ViewModels
[ObservableProperty] [ObservableProperty]
public partial CommonSongProperty SongOrderType { get; set; } = CommonSongProperty.Title; public partial CommonSongProperty SongOrderType { get; set; } = CommonSongProperty.Title;
[ObservableProperty]
public partial ObservableCollection<SongsTabInfo> SongsTabInfoList { get; set; } = [];
[ObservableProperty] [ObservableProperty]
public partial int SelectedSongsTabInfoIndex { get; set; } = 0; public partial int SelectedSongsTabInfoIndex { get; set; } = 0;
public SongsTabInfo? SelectedSongsTabInfo => SongsTabInfoList.ElementAtOrDefault(SelectedSongsTabInfoIndex); public SongsTabInfo? SelectedSongsTabInfo => AppSettings.StarredPlaylists.ElementAtOrDefault(SelectedSongsTabInfoIndex);
[ObservableProperty] [ObservableProperty] public partial bool IsDataSyncing { get; set; } = false;
public partial bool IsDataLoading { get; set; } = false; [ObservableProperty] public partial bool IsDataSyncError { get; set; } = false;
[ObservableProperty] [ObservableProperty] public partial ExtendedTrack TrackRightTapped { get; set; } = new();
public partial ExtendedTrack TrackRightTapped { get; set; } = new();
[ObservableProperty] [ObservableProperty]
public partial string SongSearchQuery { get; set; } = string.Empty; public partial string SongSearchQuery { get; set; } = string.Empty;
public MusicGalleryPageViewModel(ISettingsService settingsService, ILibWatcherService libWatcherService, ILocalizationService localizationService) public ObservableCollection<FolderNode> FolderRoots { get; } = new();
public MusicGalleryPageViewModel(
ISettingsService settingsService,
ILocalizationService localizationService,
IFileSystemService fileSystemService
)
{ {
_localizationService = localizationService; _localizationService = localizationService;
_fileSystemService = fileSystemService;
_refreshSongsTimer = _dispatcherQueue.CreateTimer(); _refreshSongsTimer = _dispatcherQueue.CreateTimer();
_settingsService = settingsService; _settingsService = settingsService;
@@ -104,8 +119,6 @@ namespace BetterLyrics.WinUI3.ViewModels
TrackPlayingQueue = [.. AppSettings.MusicGallerySettings.PlayQueuePaths.Select(x => new PlayQueueItem(new ExtendedTrack(x)))]; TrackPlayingQueue = [.. AppSettings.MusicGallerySettings.PlayQueuePaths.Select(x => new PlayQueueItem(new ExtendedTrack(x)))];
TrackPlayingQueue.CollectionChanged += TrackPlayingQueue_CollectionChanged; TrackPlayingQueue.CollectionChanged += TrackPlayingQueue_CollectionChanged;
SongsTabInfoList.Add(new SongsTabInfo(_localizationService.GetLocalizedString("MusicGalleryPageAllSongs"), "\uE8A9", false, false, CommonSongProperty.Title, string.Empty));
RefreshSongs(); RefreshSongs();
_settingsService.AppSettings.LocalMediaFolders.CollectionChanged += LocalMediaFolders_CollectionChanged; _settingsService.AppSettings.LocalMediaFolders.CollectionChanged += LocalMediaFolders_CollectionChanged;
@@ -125,19 +138,16 @@ namespace BetterLyrics.WinUI3.ViewModels
_smtc.IsPreviousEnabled = true; _smtc.IsPreviousEnabled = true;
_smtc.ButtonPressed += Smtc_ButtonPressed; _smtc.ButtonPressed += Smtc_ButtonPressed;
_smtc.PlaybackPositionChangeRequested += Smtc_PlaybackPositionChangeRequested; _smtc.PlaybackPositionChangeRequested += Smtc_PlaybackPositionChangeRequested;
_libWatcherService = libWatcherService;
_libWatcherService.MusicLibraryFilesChanged += LibWatcherService_MusicLibraryFilesChanged;
}
private void TrackPlayingQueue_CollectionChanged(object? sender, System.Collections.Specialized.NotifyCollectionChangedEventArgs e)
{
AppSettings.MusicGallerySettings.PlayQueuePaths = [.. TrackPlayingQueue.Select(x => x.Track.Path)];
} }
private void LocalMediaFolders_ItemPropertyChanged(object? sender, ItemPropertyChangedEventArgs e) private void LocalMediaFolders_ItemPropertyChanged(object? sender, ItemPropertyChangedEventArgs e)
{ {
RefreshSongs(); IsDataSyncError = AppSettings.LocalMediaFolders.Any(x => x.StatusSeverity == InfoBarSeverity.Error);
}
private void TrackPlayingQueue_CollectionChanged(object? sender, System.Collections.Specialized.NotifyCollectionChangedEventArgs e)
{
AppSettings.MusicGallerySettings.PlayQueuePaths = [.. TrackPlayingQueue.Select(x => x.Track.DecodedAbsoluteUri)];
} }
private void LocalMediaFolders_CollectionChanged(object? sender, System.Collections.Specialized.NotifyCollectionChangedEventArgs e) private void LocalMediaFolders_CollectionChanged(object? sender, System.Collections.Specialized.NotifyCollectionChangedEventArgs e)
@@ -263,11 +273,6 @@ namespace BetterLyrics.WinUI3.ViewModels
} }
} }
private void LibWatcherService_MusicLibraryFilesChanged(object? sender, Events.LibChangedEventArgs e)
{
RefreshSongs();
}
public void CancelRefreshSongs() public void CancelRefreshSongs()
{ {
} }
@@ -276,113 +281,60 @@ namespace BetterLyrics.WinUI3.ViewModels
{ {
_refreshSongsTimer.Debounce(() => _refreshSongsTimer.Debounce(() =>
{ {
IsDataLoading = true; _ = Task.Run(async () =>
_tracks.Clear();
Task.Run(async () =>
{ {
try var enabledFolderIds = _settingsService.AppSettings.LocalMediaFolders
.Where(f => f.IsEnabled)
.Select(f => f.Id)
.ToList();
var cachedFiles = await _fileSystemService.GetParsedFilesAsync(enabledFolderIds);
cachedFiles = cachedFiles.Where(x => FileHelper.MusicExtensions.Contains(Path.GetExtension(x.FileName))).ToList();
var newTrackList = cachedFiles
.Select(x => new ExtendedTrack(x))
.ToList();
_dispatcherQueue.TryEnqueue(() =>
{ {
foreach (var folder in _settingsService.AppSettings.LocalMediaFolders) _allTracks = newTrackList;
{
if (!folder.IsEnabled) continue;
try // 更新文件夹树
{ RefreshTreeView();
using var fs = folder.CreateFileSystem();
if (fs == null) continue; // 应用过滤器
if (!await fs.ConnectAsync()) continue;
// 递归扫描队列
var foldersToScan = new Queue<string>();
foldersToScan.Enqueue(""); // 从根目录开始
while (foldersToScan.Count > 0)
{
var currentPath = foldersToScan.Dequeue();
var items = await fs.GetFilesAsync(currentPath);
foreach (var item in items)
{
if (item.IsFolder)
{
foldersToScan.Enqueue(Path.Combine(currentPath, item.Name));
continue;
}
var ext = Path.GetExtension(item.Name).ToLower();
if (FileHelper.MusicExtensions.Contains(ext))
{
try
{
using (var stream = await fs.OpenReadAsync(item.FullPath))
{
ExtendedTrack track = new ExtendedTrack(item.FullPath, stream);
if (track.Duration > 0)
{
// 读取专辑图写入内存
// 因为此后该流将关闭无法再次访问
_ = track.EmbeddedPictures;
_tracks.Add(track);
}
}
}
catch (Exception ex)
{
System.Diagnostics.Debug.WriteLine($"Error loading track {item.Name}: {ex.Message}");
}
}
}
}
}
catch (Exception ex)
{
System.Diagnostics.Debug.WriteLine($"Folder scan error ({folder.Name}): {ex.Message}");
}
}
}
catch (Exception ex)
{
System.Diagnostics.Debug.WriteLine($"Global scan error: {ex.Message}");
}
_dispatcherQueue.TryEnqueue(DispatcherQueuePriority.Low, () =>
{
ApplyPlaylist(); ApplyPlaylist();
ApplySongSearchQuery(); ApplySongSearchQuery();
IsLocalMediaNotFound = !_filteredTracks.Any(); IsLocalMediaNotFound = !_filteredTracks.Any();
ApplySongOrderType(); ApplySongOrderType();
IsDataLoading = false;
}); });
}); });
}, Constants.Time.DebounceTimeout); }, Time.DebounceTimeout);
} }
public void ApplyPlaylist() public void ApplyPlaylist()
{ {
if (SelectedSongsTabInfo?.FilterValue == string.Empty) if (SelectedSongsTabInfo?.FilterValue == string.Empty)
{ {
_playlistTracks = _tracks; _middleTracks = _allTracks;
} }
else else
{ {
switch (SelectedSongsTabInfo?.FilterProperty) switch (SelectedSongsTabInfo?.FilterProperty)
{ {
case CommonSongProperty.Title: case CommonSongProperty.Title:
_playlistTracks = _tracks.Where(t => t.Title.Equals(SelectedSongsTabInfo.FilterValue, StringComparison.OrdinalIgnoreCase)).ToList(); _middleTracks = _allTracks.Where(t => t.Title.Equals(SelectedSongsTabInfo.FilterValue, StringComparison.OrdinalIgnoreCase)).ToList();
break; break;
case CommonSongProperty.Album: case CommonSongProperty.Album:
_playlistTracks = _tracks.Where(t => t.Album.Equals(SelectedSongsTabInfo.FilterValue, StringComparison.OrdinalIgnoreCase)).ToList(); _middleTracks = _allTracks.Where(t => t.Album.Equals(SelectedSongsTabInfo.FilterValue, StringComparison.OrdinalIgnoreCase)).ToList();
break; break;
case CommonSongProperty.Artist: case CommonSongProperty.Artist:
_playlistTracks = _tracks.Where(t => t.Artist.Equals(SelectedSongsTabInfo.FilterValue, StringComparison.OrdinalIgnoreCase)).ToList(); _middleTracks = _allTracks.Where(t => t.Artist.Equals(SelectedSongsTabInfo.FilterValue, StringComparison.OrdinalIgnoreCase)).ToList();
break; break;
case CommonSongProperty.Folder: case CommonSongProperty.Folder:
_playlistTracks = _tracks.Where(t => t.ParentFolderPath.Equals(SelectedSongsTabInfo.FilterValue, StringComparison.OrdinalIgnoreCase)).ToList(); _middleTracks = _allTracks.Where(t => t.ParentFolderPath.Equals(SelectedSongsTabInfo.FilterValue, StringComparison.OrdinalIgnoreCase)).ToList();
break; break;
case CommonSongProperty.M3UFilePath: case CommonSongProperty.M3UFilePath:
if (SelectedSongsTabInfo.FilterValue is string path) if (SelectedSongsTabInfo.FilterValue is string path)
@@ -390,11 +342,11 @@ namespace BetterLyrics.WinUI3.ViewModels
if (File.Exists(path)) if (File.Exists(path))
{ {
var m3uFileContent = File.ReadAllText(path); var m3uFileContent = File.ReadAllText(path);
_playlistTracks = _tracks.Where(t => m3uFileContent.Contains(t.Path)).ToList(); _middleTracks = _allTracks.Where(t => m3uFileContent.Contains(t.DecodedAbsoluteUri)).ToList();
} }
else else
{ {
_playlistTracks = []; _middleTracks = [];
ToastHelper.ShowToast("PlaylistViewFailed", path, InfoBarSeverity.Success); ToastHelper.ShowToast("PlaylistViewFailed", path, InfoBarSeverity.Success);
} }
} }
@@ -412,10 +364,10 @@ namespace BetterLyrics.WinUI3.ViewModels
{ {
if (string.IsNullOrWhiteSpace(SongSearchQuery)) if (string.IsNullOrWhiteSpace(SongSearchQuery))
{ {
_filteredTracks = _playlistTracks; _filteredTracks = _middleTracks;
return; return;
} }
_filteredTracks = _playlistTracks.Where(t => _filteredTracks = _middleTracks.Where(t =>
t.Title.Contains(SongSearchQuery, StringComparison.OrdinalIgnoreCase) || t.Title.Contains(SongSearchQuery, StringComparison.OrdinalIgnoreCase) ||
t.Artist.Contains(SongSearchQuery, StringComparison.OrdinalIgnoreCase) || t.Artist.Contains(SongSearchQuery, StringComparison.OrdinalIgnoreCase) ||
t.Album.Contains(SongSearchQuery, StringComparison.OrdinalIgnoreCase) || t.Album.Contains(SongSearchQuery, StringComparison.OrdinalIgnoreCase) ||
@@ -456,17 +408,52 @@ namespace BetterLyrics.WinUI3.ViewModels
} }
} }
public void UpdateSelectedPlaylist(SongsTabInfo playlist) private void RefreshTreeView()
{ {
var found = SongsTabInfoList.FirstOrDefault(x => x.FilterProperty == playlist.FilterProperty && x.FilterValue == playlist.FilterValue); var roots = FolderTreeBuilder.Build(_allTracks, AppSettings.LocalMediaFolders.ToList());
FolderRoots.Clear();
foreach (var r in roots) FolderRoots.Add(r);
}
public void SelectFolder(FolderNode? folder)
{
if (folder == null) return;
if (_allTracks == null) return;
string baseUri = folder.FolderPath;
if (!baseUri.EndsWith("/")) baseUri += "/";
_middleTracks = _allTracks.Where(track =>
{
if (track.MediaFolderId != folder.MediaFolderId) return false;
string trackUriDecoded = System.Net.WebUtility.UrlDecode(track.Uri);
if (!trackUriDecoded.StartsWith(baseUri, StringComparison.OrdinalIgnoreCase)) return false;
string relativePart = trackUriDecoded.Substring(baseUri.Length);
return !relativePart.Contains('/');
}).ToList();
ApplySongSearchQuery();
IsLocalMediaNotFound = !_filteredTracks.Any();
ApplySongOrderType();
}
public void AddToPlaylists(SongsTabInfo playlist)
{
var starredPlaylists = AppSettings.StarredPlaylists;
var found = starredPlaylists.FirstOrDefault(x => x.FilterProperty == playlist.FilterProperty && x.FilterValue == playlist.FilterValue);
if (found == null) if (found == null)
{ {
SongsTabInfoList.Add(playlist); starredPlaylists.Add(playlist);
SelectedSongsTabInfoIndex = SongsTabInfoList.Count - 1; SelectedSongsTabInfoIndex = starredPlaylists.Count - 1;
} }
else else
{ {
SelectedSongsTabInfoIndex = SongsTabInfoList.IndexOf(found); SelectedSongsTabInfoIndex = starredPlaylists.IndexOf(found);
} }
ApplyPlaylist(); ApplyPlaylist();
} }
@@ -480,30 +467,124 @@ namespace BetterLyrics.WinUI3.ViewModels
{ {
_timelineController.Pause(); _timelineController.Pause();
_mediaPlayer.Source = null; _mediaPlayer.Source = null;
// 清理旧资源
_currentStream?.Dispose();
_currentNetStream?.Dispose();
_currentStream = null;
_currentNetStream = null;
if (playQueueItem == null) if (playQueueItem == null)
{ {
_smtc.IsEnabled = false; _smtc.IsEnabled = false;
_smtc.DisplayUpdater.ClearAll();
} }
else else
{ {
PlayingTrack = playQueueItem.Track; PlayingTrack = playQueueItem.Track;
var updater = _smtc.DisplayUpdater;
updater.ClearAll();
_smtc.IsEnabled = true; _smtc.IsEnabled = true;
_mediaPlayer.Source = MediaSource.CreateFromUri(new Uri(PlayingTrack.Path));
var storageFile = await StorageFile.GetFileFromPathAsync(PlayingTrack.Path); try
{
var targetFolder = _settingsService.AppSettings.LocalMediaFolders.FirstOrDefault(f =>
{
var fUri = f.GetStandardUri().AbsoluteUri;
return PlayingTrack.Uri.StartsWith(fUri, StringComparison.OrdinalIgnoreCase);
});
await updater.CopyFromFileAsync(MediaPlaybackType.Music, storageFile); if (targetFolder == null)
updater.AppMediaId = Package.Current.Id.FullName; {
updater.MusicProperties.AlbumTitle = PlayingTrack.Album; throw new FileNotFoundException(null, PlayingTrack.DecodedAbsoluteUri);
updater.MusicProperties.Genres.Add($"{ExtendedGenreFiled.FileName}{Path.GetFileNameWithoutExtension(PlayingTrack.Path)}"); }
updater.Update();
_currentProvider = targetFolder.CreateFileSystem();
if (_currentProvider == null) return;
await _currentProvider.ConnectAsync();
var fileCacheStub = new FilesIndexItem
{
Uri = PlayingTrack.Uri
};
var sourceStream = await _fileSystemService.OpenFileAsync(_currentProvider, fileCacheStub);
if (sourceStream == null)
{
throw new FileNotFoundException(null, fileCacheStub.Uri);
}
if (sourceStream.CanSeek)
{
_currentNetStream = sourceStream;
}
else
{
var memStream = new MemoryStream();
await sourceStream.CopyToAsync(memStream);
memStream.Position = 0;
sourceStream.Dispose();
_currentNetStream = memStream;
}
_currentStream = _currentNetStream.AsRandomAccessStream();
string contentType = GetMimeType(PlayingTrack.FileName);
var mediaSource = MediaSource.CreateFromStream(_currentStream, contentType);
_mediaPlayer.Source = mediaSource;
var updater = _smtc.DisplayUpdater;
updater.Type = MediaPlaybackType.Music;
updater.MusicProperties.Title = PlayingTrack.Title ?? PlayingTrack.FileName;
updater.MusicProperties.Artist = PlayingTrack.Artist ?? "";
updater.MusicProperties.AlbumTitle = PlayingTrack.Album ?? "";
updater.MusicProperties.Genres.Clear();
updater.MusicProperties.Genres.Add($"{ExtendedGenreFiled.FileName}{Path.GetFileNameWithoutExtension(PlayingTrack.FileName)}");
updater.AppMediaId = Package.Current.Id.FullName;
if (!string.IsNullOrEmpty(PlayingTrack.LocalAlbumArtPath) && File.Exists(PlayingTrack.LocalAlbumArtPath))
{
var storageFile = await StorageFile.GetFileFromPathAsync(PlayingTrack.LocalAlbumArtPath);
updater.Thumbnail = RandomAccessStreamReference.CreateFromFile(storageFile);
}
else
{
updater.Thumbnail = null;
}
updater.Update();
}
catch (Exception ex)
{
ToastHelper.ShowToast("Error", ex.Message, InfoBarSeverity.Error);
_timelineController.Pause();
}
} }
} }
private string GetMimeType(string path)
{
var ext = Path.GetExtension(path).ToLower();
return ext switch
{
".mp3" => "audio/mpeg",
".flac" => "audio/flac",
".wav" => "audio/wav",
".m4a" => "audio/mp4",
".aac" => "audio/aac",
".ogg" => "audio/ogg",
".wma" => "audio/x-ms-wma",
_ => "application/octet-stream"
};
}
partial void OnSongOrderTypeChanged(CommonSongProperty value) partial void OnSongOrderTypeChanged(CommonSongProperty value)
{ {
ApplySongOrderType(); ApplySongOrderType();
@@ -524,8 +605,6 @@ namespace BetterLyrics.WinUI3.ViewModels
FilterProperty = CommonSongProperty.M3UFilePath, FilterProperty = CommonSongProperty.M3UFilePath,
FilterValue = file.Path, FilterValue = file.Path,
Icon = "\uE7BC", Icon = "\uE7BC",
IsStarred = true,
IsClosable = true,
Name = file.Name Name = file.Name
}); });
} }
@@ -557,16 +636,48 @@ namespace BetterLyrics.WinUI3.ViewModels
} }
} }
[RelayCommand]
private void SwitchPlaybackOrder()
{
AppSettings.MusicGallerySettings.PlaybackOrder = AppSettings.MusicGallerySettings.PlaybackOrder.GetNext();
}
[RelayCommand] [RelayCommand]
private async Task StopTrackAsync() private async Task StopTrackAsync()
{ {
await PlayTrackAtAsync(-1); await PlayTrackAtAsync(-1);
} }
public void Receive(PropertyChangedMessage<DateTime?> message)
{
if (message.Sender is MediaFolder)
{
if (message.PropertyName == nameof(MediaFolder.LastSyncTime))
{
RefreshSongs();
}
}
}
public void Receive(PropertyChangedMessage<bool> message)
{
if (message.Sender is MediaFolder)
{
if (message.PropertyName == nameof(MediaFolder.IsEnabled))
{
RefreshSongs();
}
else if (message.PropertyName == nameof(MediaFolder.IsProcessing))
{
IsDataSyncing = message.NewValue;
}
}
}
public void Receive(PropertyChangedMessage<string> message)
{
if (message.Sender is MediaFolder)
{
if (message.PropertyName == nameof(MediaFolder.Name))
{
RefreshTreeView();
}
}
}
} }
} }

View File

@@ -1,4 +1,5 @@
using BetterLyrics.WinUI3.Hooks; using BetterLyrics.WinUI3.Extensions;
using BetterLyrics.WinUI3.Hooks;
using BetterLyrics.WinUI3.Models; using BetterLyrics.WinUI3.Models;
using BetterLyrics.WinUI3.Services.MediaSessionsService; using BetterLyrics.WinUI3.Services.MediaSessionsService;
using BetterLyrics.WinUI3.Views; using BetterLyrics.WinUI3.Views;

View File

@@ -0,0 +1,148 @@
using BetterLyrics.WinUI3.Enums;
using BetterLyrics.WinUI3.Helper;
using BetterLyrics.WinUI3.Models;
using BetterLyrics.WinUI3.Models.Stats;
using BetterLyrics.WinUI3.Services.PlayHistoryService;
using CommunityToolkit.Mvvm.ComponentModel;
using CommunityToolkit.Mvvm.Input;
using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace BetterLyrics.WinUI3.ViewModels
{
public partial class StatsDashboardControlViewModel : ObservableObject
{
private readonly IPlayHistoryService _playHistoryService;
public StatsDashboardControlViewModel(IPlayHistoryService playHistoryService)
{
_playHistoryService = playHistoryService;
}
[ObservableProperty] public partial bool IsLoading { get; set; }
[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();
public ObservableCollection<PlayerStatDisplayItem> PlayerStats { get; } = new();
/// <summary>
/// 核心方法:根据选中的 Tab 加载数据
/// </summary>
[RelayCommand]
public async Task LoadDataAsync(StatsRange range)
{
if (IsLoading) return;
IsLoading = true;
try
{
var (start, end) = CalculateDateRange(range);
var durationTask = _playHistoryService.GetTotalListeningDurationAsync(start, end);
var logsTask = _playHistoryService.GetLogsByDateRangeAsync(start, end);
var topSongsTask = _playHistoryService.GetTopSongsAsync(start, end, 10);
var topArtistsTask = _playHistoryService.GetTopArtistsAsync(start, end, 10);
var playersTask = _playHistoryService.GetPlayerDistributionAsync(start, end);
await Task.WhenAll(durationTask, logsTask, topSongsTask, topArtistsTask, playersTask);
TotalDuration = await durationTask;
var logs = await logsTask;
TotalTracksPlayed = logs.Count;
TopSongs.Clear();
foreach (var item in await topSongsTask) TopSongs.Add(item);
TopArtists.Clear();
foreach (var item in await topArtistsTask) TopArtists.Add(item);
UpdatePlayerStats(await playersTask);
}
catch (Exception ex)
{
System.Diagnostics.Debug.WriteLine($"Error loading stats: {ex.Message}");
}
finally
{
IsLoading = false;
}
}
[RelayCommand]
private async Task GenerateTestDataAsync()
{
await _playHistoryService.GenerateTestDataAsync(10000);
}
/// <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

@@ -29,13 +29,174 @@
</Page.Resources> </Page.Resources>
<Grid> <Grid>
<Grid Padding="12,0,12,64" ColumnSpacing="12"> <Grid Padding="12,4,12,68" ColumnSpacing="12">
<Grid.ColumnDefinitions> <Grid.ColumnDefinitions>
<ColumnDefinition Width="3*" /> <ColumnDefinition Width="Auto" />
<ColumnDefinition Width="*" /> <ColumnDefinition Width="Auto" />
<ColumnDefinition />
</Grid.ColumnDefinitions> </Grid.ColumnDefinitions>
<Grid x:Name="SongViewer" Grid.Column="0">
<ScrollViewer x:Name="LeftSidePanel" Grid.Column="0">
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="Auto" />
<RowDefinition Height="Auto" />
<RowDefinition Height="Auto" />
<RowDefinition Height="Auto" />
<RowDefinition Height="Auto" />
</Grid.RowDefinitions>
<TextBlock
x:Uid="MusicGalleryPagePlaylist"
Grid.Row="0"
Margin="1,8,0,6"
Style="{StaticResource SettingsSectionHeaderTextBlockStyle}" />
<Grid Grid.Row="1">
<Grid.RowDefinitions>
<RowDefinition Height="*" />
<RowDefinition Height="Auto" />
<RowDefinition Height="Auto" />
</Grid.RowDefinitions>
<!-- 播放列表 -->
<ListView
x:Name="StarredPlaylistsListView"
Grid.Row="0"
ItemsSource="{x:Bind ViewModel.AppSettings.StarredPlaylists, Mode=OneWay}"
SelectedIndex="{x:Bind ViewModel.SelectedSongsTabInfoIndex, Mode=TwoWay}">
<ListView.ItemTemplate>
<DataTemplate x:DataType="models:SongsTabInfo">
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="1*" />
<ColumnDefinition Width="Auto" />
</Grid.ColumnDefinitions>
<Grid
Grid.Column="0"
ColumnSpacing="6"
Tapped="PlaylistGrid_Tapped">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto" />
<ColumnDefinition Width="*" />
</Grid.ColumnDefinitions>
<FontIcon
Grid.Column="0"
FontFamily="{StaticResource IconFontFamily}"
FontSize="16"
Glyph="{x:Bind Icon}" />
<TextBlock
Grid.Column="1"
Margin="0,8"
VerticalAlignment="Center"
Style="{StaticResource BodyTextBlockStyle}"
Text="{x:Bind Name}"
TextWrapping="Wrap" />
</Grid>
<!-- 从播放列表移除 -->
<Button
Grid.Column="1"
Click="RemoveFromPlaylistButton_Click"
Content="{ui:FontIcon FontFamily={StaticResource IconFontFamily},
FontSize=16,
Glyph=&#xE738;}"
Style="{StaticResource GhostButtonStyle}"
Visibility="{x:Bind IsDefault, Converter={StaticResource BoolNegationToVisibilityConverter}}">
<ToolTipService.ToolTip>
<TextBlock x:Uid="MusicGalleryPageRemoveFromCustomList" />
</ToolTipService.ToolTip>
</Button>
</Grid>
</DataTemplate>
</ListView.ItemTemplate>
</ListView>
<NavigationViewItemSeparator Grid.Row="1" />
<!-- 命令区域 -->
<Grid Grid.Row="2">
<StackPanel>
<!-- 创建播放列表 -->
<Button
HorizontalAlignment="Stretch"
HorizontalContentAlignment="Stretch"
Background="Transparent"
BorderBrush="Transparent"
Command="{x:Bind ViewModel.CreatePlaylistCommand}">
<Button.Content>
<StackPanel
Padding="4,0"
VerticalAlignment="Center"
Orientation="Horizontal"
Spacing="6">
<FontIcon
FontFamily="{StaticResource IconFontFamily}"
FontSize="16"
Glyph="&#xE710;" />
<TextBlock x:Uid="MusicGalleryPageNewPlaylist" />
</StackPanel>
</Button.Content>
</Button>
<!-- 导入播放列表 -->
<Button
HorizontalAlignment="Stretch"
HorizontalContentAlignment="Stretch"
Background="Transparent"
BorderBrush="Transparent"
Command="{x:Bind ViewModel.ImportPlaylistCommand}">
<Button.Content>
<StackPanel
Padding="4,0"
VerticalAlignment="Center"
Orientation="Horizontal"
Spacing="6">
<FontIcon
FontFamily="{StaticResource IconFontFamily}"
FontSize="16"
Glyph="&#xE896;" />
<TextBlock x:Uid="MusicGalleryPageImportFromFile" />
</StackPanel>
</Button.Content>
</Button>
</StackPanel>
</Grid>
</Grid>
<NavigationViewItemSeparator Grid.Row="2" />
<TextBlock
x:Uid="MusicGalleryPageFolder"
Grid.Row="3"
Margin="1,4,0,6"
Style="{StaticResource SettingsSectionHeaderTextBlockStyle}" />
<TreeView
x:Name="FolderTreeView"
Grid.Row="4"
AllowDrop="False"
CanDrag="False"
CanDragItems="False"
ItemInvoked="FolderTreeView_ItemInvoked"
ItemsSource="{x:Bind ViewModel.FolderRoots, Mode=OneWay}"
SelectionMode="Single">
<TreeView.ItemTemplate>
<DataTemplate x:DataType="models:FolderNode">
<TreeViewItem IsExpanded="{x:Bind IsExpanded, Mode=TwoWay}" ItemsSource="{x:Bind SubFolders}">
<StackPanel Orientation="Horizontal" Spacing="10">
<FontIcon FontSize="16" Glyph="{x:Bind SourceType, Converter={StaticResource FileSourceTypeToIconConverter}}" />
<TextBlock VerticalAlignment="Center" Text="{x:Bind FolderName}" />
</StackPanel>
</TreeViewItem>
</DataTemplate>
</TreeView.ItemTemplate>
</TreeView>
</Grid>
</ScrollViewer>
<controls:ContentSizer Grid.Column="1" TargetControl="{x:Bind LeftSidePanel}" />
<Grid x:Name="SongViewer" Grid.Column="2">
<Grid.RowDefinitions> <Grid.RowDefinitions>
<RowDefinition Height="Auto" />
<RowDefinition Height="Auto" /> <RowDefinition Height="Auto" />
<RowDefinition Height="*" /> <RowDefinition Height="*" />
</Grid.RowDefinitions> </Grid.RowDefinitions>
@@ -62,7 +223,7 @@
</Rectangle.Fill> </Rectangle.Fill>
</Rectangle> </Rectangle>
</controls:OpacityMaskView.OpacityMask> </controls:OpacityMaskView.OpacityMask>
<Image Source="{x:Bind ViewModel.TrackRightTapped.EmbeddedPictures, Mode=OneWay, Converter={StaticResource PictureInfosToImageSourceConverter}}" Stretch="Uniform" /> <Image Source="{x:Bind ViewModel.TrackRightTapped.LocalAlbumArtPath, Mode=OneWay, Converter={StaticResource PathToImageConverter}}" Stretch="Uniform" />
</controls:OpacityMaskView> </controls:OpacityMaskView>
<StackPanel <StackPanel
Grid.Row="1" Grid.Row="1"
@@ -76,12 +237,9 @@
<uc:PropertyRow x:Uid="MusicGalleryPageFileInfoBitrate" Value="{x:Bind ViewModel.TrackRightTapped.Bitrate, Mode=OneWay}" /> <uc:PropertyRow x:Uid="MusicGalleryPageFileInfoBitrate" Value="{x:Bind ViewModel.TrackRightTapped.Bitrate, Mode=OneWay}" />
<uc:PropertyRow x:Uid="MusicGalleryPageFileInfoSampleRate" Value="{x:Bind ViewModel.TrackRightTapped.SampleRate, Mode=OneWay}" /> <uc:PropertyRow x:Uid="MusicGalleryPageFileInfoSampleRate" Value="{x:Bind ViewModel.TrackRightTapped.SampleRate, Mode=OneWay}" />
<uc:PropertyRow x:Uid="MusicGalleryPageFileInfoBitDepth" Value="{x:Bind ViewModel.TrackRightTapped.BitDepth, Mode=OneWay}" /> <uc:PropertyRow x:Uid="MusicGalleryPageFileInfoBitDepth" Value="{x:Bind ViewModel.TrackRightTapped.BitDepth, Mode=OneWay}" />
<uc:PropertyRow x:Uid="MusicGalleryPageFileInfoFormat" Value="{x:Bind ViewModel.TrackRightTapped.AudioFormat.Name, Mode=OneWay}" /> <uc:PropertyRow x:Uid="MusicGalleryPageFileInfoFormat" Value="{x:Bind ViewModel.TrackRightTapped.AudioFormatName, Mode=OneWay}" />
<uc:PropertyRow x:Uid="MusicGalleryPageFileInfoEncoder" Value="{x:Bind ViewModel.TrackRightTapped.Encoder, Mode=OneWay}" /> <uc:PropertyRow x:Uid="MusicGalleryPageFileInfoEncoder" Value="{x:Bind ViewModel.TrackRightTapped.Encoder, Mode=OneWay}" />
<uc:PropertyRow <uc:PropertyRow x:Uid="MusicGalleryPageFileInfoPath" Value="{x:Bind ViewModel.TrackRightTapped.DecodedAbsoluteUri, Mode=OneWay}" />
x:Uid="MusicGalleryPageFileInfoPath"
Link="{x:Bind ViewModel.TrackRightTapped.Path, Mode=OneWay}"
Value="{x:Bind ViewModel.TrackRightTapped.Path, Mode=OneWay}" />
<uc:PropertyRow x:Uid="MusicGalleryPageFileInfoLyrics" Value="{x:Bind ViewModel.TrackRightTapped.RawLyrics, Mode=OneWay}" /> <uc:PropertyRow x:Uid="MusicGalleryPageFileInfoLyrics" Value="{x:Bind ViewModel.TrackRightTapped.RawLyrics, Mode=OneWay}" />
</StackPanel> </StackPanel>
</Grid> </Grid>
@@ -91,205 +249,15 @@
<StackPanel Grid.Row="0" Spacing="6"> <StackPanel Grid.Row="0" Spacing="6">
<Grid VerticalAlignment="Top">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto" />
<ColumnDefinition Width="*" />
</Grid.ColumnDefinitions>
<Button
x:Name="PlaylistButton"
Grid.Column="0"
Style="{StaticResource GhostButtonStyle}">
<Button.Content>
<StackPanel Orientation="Horizontal" Spacing="6">
<FontIcon
FontFamily="{StaticResource IconFontFamily}"
FontSize="16"
Glyph="&#xE728;" />
<TextBlock x:Uid="MusicGalleryPagePlaylist" />
</StackPanel>
</Button.Content>
<Button.Flyout>
<Flyout FlyoutPresenterStyle="{StaticResource FlyoutGhostStyle}">
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="Auto" />
<RowDefinition Height="Auto" />
<RowDefinition Height="*" />
</Grid.RowDefinitions>
<Button
Grid.Row="0"
Margin="4"
HorizontalAlignment="Stretch"
HorizontalContentAlignment="Stretch"
Background="Transparent"
BorderBrush="Transparent"
Command="{x:Bind ViewModel.CreatePlaylistCommand}">
<Button.Content>
<StackPanel
VerticalAlignment="Center"
Orientation="Horizontal"
Spacing="6">
<FontIcon
FontFamily="{StaticResource IconFontFamily}"
FontSize="16"
Glyph="&#xE710;" />
<TextBlock x:Uid="MusicGalleryPageNewPlaylist" />
</StackPanel>
</Button.Content>
</Button>
<Button
Grid.Row="1"
Margin="4,1,4,2"
HorizontalAlignment="Stretch"
HorizontalContentAlignment="Stretch"
Background="Transparent"
BorderBrush="Transparent"
Command="{x:Bind ViewModel.ImportPlaylistCommand}">
<Button.Content>
<StackPanel
VerticalAlignment="Center"
Orientation="Horizontal"
Spacing="6">
<FontIcon
FontFamily="{StaticResource IconFontFamily}"
FontSize="16"
Glyph="&#xE74B;" />
<TextBlock x:Uid="MusicGalleryPageImportFromFile" />
</StackPanel>
</Button.Content>
</Button>
<ListView
x:Name="StarredPlaylistsListView"
Grid.Row="2"
ItemsSource="{x:Bind ViewModel.AppSettings.StarredPlaylists, Mode=OneWay}">
<ListView.ItemTemplate>
<DataTemplate x:DataType="models:SongsTabInfo">
<Grid Tapped="StarredPlaylistsListViewItemGrid_Tapped">
<StackPanel Orientation="Horizontal" Spacing="6">
<FontIcon
FontFamily="{StaticResource IconFontFamily}"
FontSize="16"
Glyph="{x:Bind Icon}" />
<TextBlock
Margin="0,0,0,2"
VerticalAlignment="Center"
Style="{StaticResource BodyTextBlockStyle}"
Text="{x:Bind Name}" />
</StackPanel>
</Grid>
</DataTemplate>
</ListView.ItemTemplate>
</ListView>
</Grid>
</Flyout>
</Button.Flyout>
</Button>
<ListView
Grid.Column="1"
ItemContainerStyle="{StaticResource ListViewStretchedItemContainerStyle}"
ItemsSource="{x:Bind ViewModel.SongsTabInfoList, Mode=OneWay}"
ScrollViewer.HorizontalScrollBarVisibility="Hidden"
ScrollViewer.HorizontalScrollMode="Enabled"
ScrollViewer.VerticalScrollBarVisibility="Disabled"
ScrollViewer.VerticalScrollMode="Disabled"
SelectedIndex="{x:Bind ViewModel.SelectedSongsTabInfoIndex, Mode=TwoWay}">
<ListView.ItemsPanel>
<ItemsPanelTemplate>
<ItemsStackPanel Orientation="Horizontal" />
</ItemsPanelTemplate>
</ListView.ItemsPanel>
<ListView.ItemTemplate>
<DataTemplate x:DataType="models:SongsTabInfo">
<Grid Padding="12,0">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto" />
<ColumnDefinition Width="1*" />
<ColumnDefinition Width="Auto" />
</Grid.ColumnDefinitions>
<Button
Grid.Column="0"
Click="PlaylistFavButton_Click"
Foreground="{ThemeResource TextFillColorSecondaryBrush}"
Style="{StaticResource GhostButtonStyle}"
Visibility="{x:Bind IsClosable, Converter={StaticResource BoolToVisibilityConverter}, Mode=OneWay}">
<ToolTipService.ToolTip>
<Grid>
<TextBlock x:Uid="MusicGalleryPageAddToCustomList" Visibility="{x:Bind IsStarred, Converter={StaticResource BoolNegationToVisibilityConverter}, Mode=OneWay}" />
<TextBlock x:Uid="MusicGalleryPageRemoveFromCustomList" Visibility="{x:Bind IsStarred, Converter={StaticResource BoolToVisibilityConverter}, Mode=OneWay}" />
</Grid>
</ToolTipService.ToolTip>
<Button.Content>
<Grid>
<FontIcon
FontFamily="{StaticResource IconFontFamily}"
FontSize="16"
Glyph="&#xE734;"
Opacity="{x:Bind IsStarred, Converter={StaticResource BoolNegationToOpacityConverter}, Mode=OneWay}">
<FontIcon.OpacityTransition>
<ScalarTransition />
</FontIcon.OpacityTransition>
</FontIcon>
<FontIcon
FontFamily="{StaticResource IconFontFamily}"
FontSize="16"
Glyph="&#xE735;"
Opacity="{x:Bind IsStarred, Converter={StaticResource BoolToOpacityConverter}, Mode=OneWay}">
<FontIcon.OpacityTransition>
<ScalarTransition />
</FontIcon.OpacityTransition>
</FontIcon>
</Grid>
</Button.Content>
</Button>
<Grid
Grid.Column="1"
Background="Transparent"
ColumnSpacing="6"
Tapped="PlaylistGrid_Tapped">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="1*" />
<ColumnDefinition Width="Auto" />
</Grid.ColumnDefinitions>
<FontIcon
Grid.Column="0"
FontFamily="{StaticResource IconFontFamily}"
FontSize="16"
Glyph="{x:Bind Icon}" />
<TextBlock
Grid.Column="1"
Margin="0,0,0,2"
VerticalAlignment="Center"
Style="{StaticResource BodyTextBlockStyle}"
Text="{x:Bind Name}" />
</Grid>
<Button
Grid.Column="2"
Click="PlaylistCloseButton_Click"
Content="{ui:FontIcon FontSize=16,
FontFamily={StaticResource IconFontFamily},
Glyph=&#xE711;}"
Foreground="{ThemeResource TextFillColorSecondaryBrush}"
Style="{StaticResource GhostButtonStyle}"
Visibility="{x:Bind IsClosable, Converter={StaticResource BoolToVisibilityConverter}}" />
</Grid>
</DataTemplate>
</ListView.ItemTemplate>
</ListView>
</Grid>
<AutoSuggestBox <AutoSuggestBox
x:Name="SongSearchBox" x:Name="SongSearchBox"
x:Uid="MusicGalleryPageSongSearchBox" x:Uid="MusicGalleryPageSongSearchBox"
Margin="0,-8,0,0" Margin="0,0,128,0"
HorizontalAlignment="Stretch" HorizontalAlignment="Stretch"
QueryIcon="Find" QueryIcon="Find"
Text="{x:Bind ViewModel.SongSearchQuery, Mode=TwoWay}" /> Text="{x:Bind ViewModel.SongSearchQuery, Mode=TwoWay}" />
<Grid> <Grid>
<StackPanel <StackPanel
HorizontalAlignment="Left" HorizontalAlignment="Left"
Orientation="Horizontal" Orientation="Horizontal"
@@ -337,7 +305,20 @@
</StackPanel> </StackPanel>
<SemanticZoom Grid.Row="1"> <InfoBar
x:Uid="MusicGalleryPageDataSync"
Grid.Row="1"
IsClosable="False"
IsOpen="{x:Bind ViewModel.IsDataSyncing, Mode=OneWay}" />
<InfoBar
x:Uid="MusicGalleryPageDataSyncError"
Grid.Row="1"
IsClosable="False"
IsOpen="{x:Bind ViewModel.IsDataSyncError, Mode=OneWay}"
Severity="Error" />
<SemanticZoom Grid.Row="2">
<SemanticZoom.ZoomedInView> <SemanticZoom.ZoomedInView>
<ListView <ListView
x:Name="SongListView" x:Name="SongListView"
@@ -345,39 +326,15 @@
SelectionChanged="SongListView_SelectionChanged" SelectionChanged="SongListView_SelectionChanged"
SelectionMode="Multiple"> SelectionMode="Multiple">
<ListView.ContextFlyout> <ListView.ContextFlyout>
<MenuBarItemFlyout> <MenuBarItemFlyout Opened="AddToMenuBarItemFlyout_Opened">
<MenuFlyoutSubItem x:Uid="MusicGalleryPageAddToPlayingQueue" IsEnabled="{x:Bind ViewModel.SelectedTracks.Count, Mode=OneWay, Converter={StaticResource IntToBoolConverter}}"> <MenuFlyoutSubItem x:Uid="MusicGalleryPageAddToPlayingQueue" IsEnabled="{x:Bind ViewModel.SelectedTracks.Count, Mode=OneWay, Converter={StaticResource IntToBoolConverter}}">
<MenuFlyoutItem x:Uid="MusicGalleryPageAddToNext" Click="AddSongToQueueNextMenuFlyoutItem_Click" /> <MenuFlyoutItem x:Uid="MusicGalleryPageAddToNext" Click="AddSongToQueueNextMenuFlyoutItem_Click" />
<MenuFlyoutItem x:Uid="MusicGalleryPageAddToEnd" Click="AddSongToQueueEndMenuFlyoutItem_Click" /> <MenuFlyoutItem x:Uid="MusicGalleryPageAddToEnd" Click="AddSongToQueueEndMenuFlyoutItem_Click" />
</MenuFlyoutSubItem> </MenuFlyoutSubItem>
<MenuFlyoutItem <MenuFlyoutSubItem
x:Name="AddToCustomListMenuFlyoutSubItem"
x:Uid="MusicGalleryPageAddToCustomList" x:Uid="MusicGalleryPageAddToCustomList"
Click="AddToPlaylistMenuFlyoutItem_Click" IsEnabled="{x:Bind ViewModel.SelectedTracks.Count, Mode=OneWay, Converter={StaticResource IntToBoolConverter}}" />
IsEnabled="{x:Bind ViewModel.SelectedTracks.Count, Mode=OneWay, Converter={StaticResource IntToBoolConverter}}">
<MenuFlyoutItem.ContextFlyout>
<Flyout FlyoutPresenterStyle="{StaticResource FlyoutGhostStyle}" Placement="Bottom">
<ListView ItemsSource="{x:Bind ViewModel.AppSettings.StarredPlaylists, Mode=OneWay}">
<ListView.ItemTemplate>
<DataTemplate x:DataType="models:SongsTabInfo">
<Grid Tapped="ToBeAddedPlaylistsListViewItemGrid_Tapped">
<StackPanel Orientation="Horizontal" Spacing="6">
<FontIcon
FontFamily="{StaticResource IconFontFamily}"
FontSize="16"
Glyph="{x:Bind Icon}" />
<TextBlock
Margin="0,0,0,2"
VerticalAlignment="Center"
Style="{StaticResource BodyTextBlockStyle}"
Text="{x:Bind Name}" />
</StackPanel>
</Grid>
</DataTemplate>
</ListView.ItemTemplate>
</ListView>
</Flyout>
</MenuFlyoutItem.ContextFlyout>
</MenuFlyoutItem>
</MenuBarItemFlyout> </MenuBarItemFlyout>
</ListView.ContextFlyout> </ListView.ContextFlyout>
<ListView.ItemTemplate> <ListView.ItemTemplate>
@@ -388,70 +345,53 @@
DoubleTapped="SongListViewItem_DoubleTapped"> DoubleTapped="SongListViewItem_DoubleTapped">
<Grid.ColumnDefinitions> <Grid.ColumnDefinitions>
<ColumnDefinition Width="1*" />
<ColumnDefinition Width="4*" />
<ColumnDefinition Width="4*" />
<ColumnDefinition Width="2*" /> <ColumnDefinition Width="2*" />
<ColumnDefinition Width="2*" /> <ColumnDefinition Width="2*" />
<ColumnDefinition Width="2*" /> <ColumnDefinition Width="2*" />
<ColumnDefinition Width="1*" /> <ColumnDefinition Width="1*" />
<ColumnDefinition Width="Auto" />
</Grid.ColumnDefinitions> </Grid.ColumnDefinitions>
<Grid <!-- 标题 -->
Grid.Column="0" <Grid Grid.Column="0">
MaxWidth="48" <TextBlock
MaxHeight="48" VerticalAlignment="Center"
CornerRadius="4"> Text="{x:Bind Title}"
<Image Source="{x:Bind EmbeddedPictures, Mode=OneWay, Converter={StaticResource PictureInfosToImageSourceConverter}}" Stretch="Uniform" /> TextWrapping="Wrap" />
</Grid> </Grid>
<!-- 基本信息 --> <!-- 艺术家 -->
<Grid Grid.Column="1"> <Grid Grid.Column="1">
<StackPanel VerticalAlignment="Center" Spacing="6"> <HyperlinkButton Click="ArtistHyperlibkButton_Click">
<TextBlock Text="{x:Bind Title}" TextWrapping="Wrap" /> <ToolTipService.ToolTip>
<StackPanel Orientation="Horizontal" Spacing="6"> <TextBlock x:Uid="MusicGalleryPageAddToCustomList" />
<Grid Background="{ThemeResource AccentAcrylicBackgroundFillColorBaseBrush}" CornerRadius="4"> </ToolTipService.ToolTip>
<TextBlock <TextBlock Text="{x:Bind Artist}" TextWrapping="Wrap" />
Margin="4,2" </HyperlinkButton>
FontSize="12"
Text="{x:Bind AudioFormat.ShortName}" />
</Grid>
<HyperlinkButton Padding="0" Click="ArtistHyperlibkButton_Click">
<TextBlock Text="{x:Bind Artist}" TextWrapping="Wrap" />
</HyperlinkButton>
</StackPanel>
</StackPanel>
</Grid> </Grid>
<HyperlinkButton Grid.Column="2" Click="AlbumHyperlibkButton_Click"> <!-- 专辑 -->
<TextBlock Text="{x:Bind Album}" TextWrapping="Wrap" /> <Grid Grid.Column="2">
</HyperlinkButton> <HyperlinkButton Click="AlbumHyperlibkButton_Click">
<ToolTipService.ToolTip>
<!-- 年份 --> <TextBlock x:Uid="MusicGalleryPageAddToCustomList" />
<TextBlock </ToolTipService.ToolTip>
Grid.Column="3" <TextBlock Text="{x:Bind Album}" TextWrapping="Wrap" />
VerticalAlignment="Center" </HyperlinkButton>
Foreground="{ThemeResource TextFillColorSecondaryBrush}" </Grid>
Text="{x:Bind Year}"
TextWrapping="Wrap" />
<!-- 歌曲时长 --> <!-- 歌曲时长 -->
<TextBlock <TextBlock
Grid.Column="4" Grid.Column="3"
VerticalAlignment="Center" VerticalAlignment="Center"
Foreground="{ThemeResource TextFillColorSecondaryBrush}" Foreground="{ThemeResource TextFillColorSecondaryBrush}"
Text="{x:Bind Duration, Converter={StaticResource SecondsToFormattedTimeConverter}}" Text="{x:Bind Duration, Converter={StaticResource SecondsToFormattedTimeConverter}}"
TextWrapping="Wrap" /> TextWrapping="Wrap" />
<!-- 歌曲时长 --> <!-- 更多 -->
<HyperlinkButton
Grid.Column="5"
VerticalAlignment="Center"
Click="PathHyperlibkButton_Click"
Content="{x:Bind Path, Converter={StaticResource PathToParentFolderConverter}}" />
<Button <Button
Grid.Column="6" Grid.Column="4"
HorizontalAlignment="Right"
Click="SongListViewItemMoreButton_Click" Click="SongListViewItemMoreButton_Click"
Content="{ui:FontIcon FontFamily={StaticResource IconFontFamily}, Content="{ui:FontIcon FontFamily={StaticResource IconFontFamily},
FontSize=12, FontSize=12,
@@ -500,7 +440,7 @@
</SemanticZoom.ZoomedOutView> </SemanticZoom.ZoomedOutView>
</SemanticZoom> </SemanticZoom>
<Grid Grid.Row="1" Visibility="{x:Bind ViewModel.IsLocalMediaNotFound, Mode=OneWay, Converter={StaticResource BoolToVisibilityConverter}}"> <Grid Grid.Row="2" Visibility="{x:Bind ViewModel.IsLocalMediaNotFound, Mode=OneWay, Converter={StaticResource BoolToVisibilityConverter}}">
<StackPanel <StackPanel
HorizontalAlignment="Center" HorizontalAlignment="Center"
VerticalAlignment="Center" VerticalAlignment="Center"
@@ -515,266 +455,157 @@
</Grid> </Grid>
<Grid x:Name="PlayQueue" Grid.Column="1"> </Grid>
<Grid.RowDefinitions>
<RowDefinition Height="Auto" />
<RowDefinition Height="*" />
</Grid.RowDefinitions>
<StackPanel Grid.Row="0" Spacing="6"> <Grid
<Grid ColumnSpacing="3"> x:Name="PlayQueue"
<Grid.ColumnDefinitions> Width="300"
<ColumnDefinition Width="Auto" /> Margin="0,4,4,72"
<ColumnDefinition Width="*" /> Padding="12,16,12,0"
<ColumnDefinition Width="Auto" /> HorizontalAlignment="Right"
<ColumnDefinition Width="Auto" /> Background="{ThemeResource AcrylicBackgroundFillColorDefaultBrush}"
<ColumnDefinition Width="Auto" /> BorderBrush="{ThemeResource ControlElevationBorderBrush}"
<ColumnDefinition Width="Auto" /> BorderThickness="1"
</Grid.ColumnDefinitions> CornerRadius="8"
<TextBlock Translation="310,0,0">
x:Uid="MusicGalleryPagePlayingQueue" <Grid.TranslationTransition>
Grid.Column="0" <Vector3Transition />
VerticalAlignment="Center" </Grid.TranslationTransition>
Style="{StaticResource BodyStrongTextBlockStyle}" /> <Grid.RowDefinitions>
<StackPanel <RowDefinition Height="Auto" />
Grid.Column="1" <RowDefinition Height="Auto" />
HorizontalAlignment="Stretch" <RowDefinition Height="Auto" />
VerticalAlignment="Center" <RowDefinition Height="*" />
Orientation="Horizontal"> </Grid.RowDefinitions>
<TextBlock Foreground="{ThemeResource TextFillColorSecondaryBrush}" Text="{x:Bind ViewModel.AppSettings.MusicGallerySettings.PlayQueueIndex, Mode=OneWay, Converter={StaticResource IndexToDisplayConverter}}" />
<TextBlock Foreground="{ThemeResource TextFillColorSecondaryBrush}" Text="/" />
<TextBlock Text="{x:Bind ViewModel.TrackPlayingQueue.Count, Mode=OneWay}" />
</StackPanel>
<!-- Stop media session --> <Grid Grid.Row="0">
<Button <TextBlock
Grid.Column="2" x:Uid="MusicGalleryPagePlayingQueue"
HorizontalAlignment="Right" VerticalAlignment="Center"
Command="{x:Bind ViewModel.StopTrackCommand}" Style="{StaticResource BodyStrongTextBlockStyle}" />
Content="{ui:FontIcon FontFamily={StaticResource IconFontFamily}, </Grid>
FontSize=16,
Glyph=&#xE71A;}"
Style="{StaticResource GhostButtonStyle}">
<ToolTipService.ToolTip>
<TextBlock x:Uid="MusicGalleryPageStopTrack" />
</ToolTipService.ToolTip>
</Button>
<!-- Playback order --> <Grid Grid.Row="2">
<Button <Grid.ColumnDefinitions>
Grid.Column="3" <ColumnDefinition Width="*" />
HorizontalAlignment="Right" <ColumnDefinition Width="Auto" />
Command="{x:Bind ViewModel.SwitchPlaybackOrderCommand}" <ColumnDefinition Width="Auto" />
Style="{StaticResource GhostButtonStyle}"> <ColumnDefinition Width="Auto" />
<ToolTipService.ToolTip> <ColumnDefinition Width="Auto" />
<ToolTip> </Grid.ColumnDefinitions>
<Grid>
<TextBlock x:Name="PlaybackRepeatAllHint" x:Uid="MusicGalleryPageQueueLoop" />
<TextBlock x:Name="PlaybackRepeatOneHint" x:Uid="MusicGalleryPageSingleLoop" />
<TextBlock x:Name="PlaybackShuffleHint" x:Uid="MusicGalleryPageQueueRandom" />
</Grid>
</ToolTip>
</ToolTipService.ToolTip>
<Button.Content>
<Grid>
<!-- Repeat all -->
<FontIcon
x:Name="PlaybackRepeatAll"
FontFamily="{StaticResource IconFontFamily}"
FontSize="16"
Glyph="&#xE8EE;">
<FontIcon.OpacityTransition>
<ScalarTransition />
</FontIcon.OpacityTransition>
</FontIcon>
<!-- Repeat one -->
<FontIcon
x:Name="PlaybackRepeatOne"
FontFamily="{StaticResource IconFontFamily}"
FontSize="16"
Glyph="&#xE8ED;">
<FontIcon.OpacityTransition>
<ScalarTransition />
</FontIcon.OpacityTransition>
</FontIcon>
<!-- Shuffle -->
<FontIcon
x:Name="PlaybackShuffle"
FontFamily="{StaticResource IconFontFamily}"
FontSize="16"
Glyph="&#xE8B1;">
<FontIcon.OpacityTransition>
<ScalarTransition />
</FontIcon.OpacityTransition>
</FontIcon>
</Grid>
</Button.Content>
</Button>
<!-- Scroll to playing item -->
<Button
Grid.Column="4"
HorizontalAlignment="Right"
Click="ScrollToPlayingItemButton_Click"
Content="{ui:FontIcon FontFamily={StaticResource IconFontFamily},
FontSize=16,
Glyph=&#xE7B7;}"
Style="{StaticResource GhostButtonStyle}">
<ToolTipService.ToolTip>
<TextBlock x:Uid="MusicGalleryPageScrollToPlayingItem" />
</ToolTipService.ToolTip>
</Button>
<!-- Empty play queue -->
<Button
Grid.Column="5"
HorizontalAlignment="Right"
Click="EmptyPlayingQueueButton_Click"
Content="{ui:FontIcon FontFamily={StaticResource IconFontFamily},
FontSize=16,
Glyph=&#xE738;}"
Style="{StaticResource GhostButtonStyle}">
<ToolTipService.ToolTip>
<TextBlock x:Uid="MusicGalleryPageEmptyPlayingQueue" />
</ToolTipService.ToolTip>
</Button>
</Grid>
<StackPanel
Grid.Column="0"
HorizontalAlignment="Stretch"
VerticalAlignment="Center"
Orientation="Horizontal">
<TextBlock Foreground="{ThemeResource TextFillColorSecondaryBrush}" Text="{x:Bind ViewModel.AppSettings.MusicGallerySettings.PlayQueueIndex, Mode=OneWay, Converter={StaticResource IndexToDisplayConverter}}" />
<TextBlock Foreground="{ThemeResource TextFillColorSecondaryBrush}" Text="/" />
<TextBlock Text="{x:Bind ViewModel.TrackPlayingQueue.Count, Mode=OneWay}" />
</StackPanel> </StackPanel>
<ListView <!-- Stop media session -->
x:Name="PlayingQueueListView" <Button
Grid.Row="1" Grid.Column="1"
ItemsSource="{x:Bind ViewModel.TrackPlayingQueue, Mode=OneWay}" HorizontalAlignment="Right"
SelectedIndex="{x:Bind ViewModel.AppSettings.MusicGallerySettings.PlayQueueIndex, Mode=TwoWay}"> Command="{x:Bind ViewModel.StopTrackCommand}"
<ListView.ItemTemplate> Content="{ui:FontIcon FontFamily={StaticResource IconFontFamily},
<DataTemplate> FontSize=16,
<Grid Padding="0,6"> Glyph=&#xE71A;}"
<Grid Tapped="PlayingQueueListVireItemGrid_Tapped"> Style="{StaticResource GhostButtonStyle}">
<StackPanel> <ToolTipService.ToolTip>
<TextBlock Text="{Binding Track.Title}" TextWrapping="Wrap" /> <TextBlock x:Uid="MusicGalleryPageStopTrack" />
<TextBlock </ToolTipService.ToolTip>
Foreground="{ThemeResource TextFillColorSecondaryBrush}" </Button>
Text="{Binding Track.Artist}" <!-- Scroll to playing item -->
TextWrapping="Wrap" /> <Button
</StackPanel> Grid.Column="3"
</Grid> HorizontalAlignment="Right"
<Grid HorizontalAlignment="Right"> Click="ScrollToPlayingItemButton_Click"
<Button Content="{ui:FontIcon FontFamily={StaticResource IconFontFamily},
Click="RemoveFromPlayingQueueButton_Click" FontSize=16,
Content="{ui:FontIcon FontFamily={StaticResource IconFontFamily}, Glyph=&#xE7B7;}"
FontSize=12, Style="{StaticResource GhostButtonStyle}">
Glyph=&#xE738;}" <ToolTipService.ToolTip>
Style="{StaticResource GhostButtonStyle}"> <TextBlock x:Uid="MusicGalleryPageScrollToPlayingItem" />
<ToolTipService.ToolTip> </ToolTipService.ToolTip>
<TextBlock x:Uid="MusicGalleryPageRemoveFromPlayingQueue" /> </Button>
</ToolTipService.ToolTip> <!-- Empty play queue -->
</Button> <Button
</Grid> Grid.Column="4"
HorizontalAlignment="Right"
Click="EmptyPlayingQueueButton_Click"
Content="{ui:FontIcon FontFamily={StaticResource IconFontFamily},
FontSize=16,
Glyph=&#xE738;}"
Style="{StaticResource GhostButtonStyle}">
<ToolTipService.ToolTip>
<TextBlock x:Uid="MusicGalleryPageEmptyPlayingQueue" />
</ToolTipService.ToolTip>
</Button>
</Grid>
<ListView
x:Name="PlayingQueueListView"
Grid.Row="3"
ItemsSource="{x:Bind ViewModel.TrackPlayingQueue, Mode=OneWay}"
SelectedIndex="{x:Bind ViewModel.AppSettings.MusicGallerySettings.PlayQueueIndex, Mode=TwoWay}">
<ListView.ItemTemplate>
<DataTemplate>
<Grid Padding="0,6">
<Grid Tapped="PlayingQueueListVireItemGrid_Tapped">
<StackPanel Margin="0,0,36,0">
<TextBlock Text="{Binding Track.Title}" TextWrapping="Wrap" />
<TextBlock
Foreground="{ThemeResource TextFillColorSecondaryBrush}"
Text="{Binding Track.Artist}"
TextWrapping="Wrap" />
</StackPanel>
</Grid> </Grid>
</DataTemplate> <Grid HorizontalAlignment="Right">
</ListView.ItemTemplate> <Button
</ListView> Click="RemoveFromPlayingQueueButton_Click"
Content="{ui:FontIcon FontFamily={StaticResource IconFontFamily},
FontSize=16,
Glyph=&#xE738;}"
Style="{StaticResource GhostButtonStyle}">
<ToolTipService.ToolTip>
<TextBlock x:Uid="MusicGalleryPageRemoveFromPlayingQueue" />
</ToolTipService.ToolTip>
</Button>
</Grid>
</Grid>
</DataTemplate>
</ListView.ItemTemplate>
</ListView>
<Grid Grid.Row="1"> <Grid Grid.Row="3">
<interactivity:Interaction.Behaviors> <interactivity:Interaction.Behaviors>
<interactivity:DataTriggerBehavior <interactivity:DataTriggerBehavior
Binding="{x:Bind ViewModel.TrackPlayingQueue.Count, Mode=OneWay}" Binding="{x:Bind ViewModel.TrackPlayingQueue.Count, Mode=OneWay}"
ComparisonCondition="Equal" ComparisonCondition="Equal"
Value="0"> Value="0">
<interactivity:ChangePropertyAction PropertyName="Visibility" Value="Visible" /> <interactivity:ChangePropertyAction PropertyName="Visibility" Value="Visible" />
</interactivity:DataTriggerBehavior> </interactivity:DataTriggerBehavior>
<interactivity:DataTriggerBehavior <interactivity:DataTriggerBehavior
Binding="{x:Bind ViewModel.TrackPlayingQueue.Count, Mode=OneWay}" Binding="{x:Bind ViewModel.TrackPlayingQueue.Count, Mode=OneWay}"
ComparisonCondition="NotEqual" ComparisonCondition="NotEqual"
Value="0"> Value="0">
<interactivity:ChangePropertyAction PropertyName="Visibility" Value="Collapsed" /> <interactivity:ChangePropertyAction PropertyName="Visibility" Value="Collapsed" />
</interactivity:DataTriggerBehavior> </interactivity:DataTriggerBehavior>
</interactivity:Interaction.Behaviors> </interactivity:Interaction.Behaviors>
<StackPanel <StackPanel
HorizontalAlignment="Center"
VerticalAlignment="Center"
Spacing="12">
<Image MaxWidth="100" Source="/Assets/EmptyBox.png" />
<TextBlock
x:Uid="MusicGalleryPagePlayingQueueEmpty"
HorizontalAlignment="Center" HorizontalAlignment="Center"
VerticalAlignment="Center" Foreground="{ThemeResource TextFillColorSecondaryBrush}" />
Spacing="12"> </StackPanel>
<Image MaxWidth="100" Source="/Assets/EmptyBox.png" />
<TextBlock
x:Uid="MusicGalleryPagePlayingQueueEmpty"
HorizontalAlignment="Center"
Foreground="{ThemeResource TextFillColorSecondaryBrush}" />
</StackPanel>
</Grid>
</Grid> </Grid>
</Grid> </Grid>
<Grid Background="{ThemeResource SolidBackgroundFillColorBaseBrush}" Visibility="{x:Bind ViewModel.IsDataLoading, Mode=OneWay, Converter={StaticResource BoolToVisibilityConverter}}">
<Grid Margin="12">
<Grid.RowDefinitions>
<RowDefinition Height="48" />
<RowDefinition Height="12" />
<RowDefinition Height="*" />
<RowDefinition Height="12" />
<RowDefinition Height="*" />
<RowDefinition Height="12" />
<RowDefinition Height="*" />
</Grid.RowDefinitions>
<labs:Shimmer Grid.Row="0" CornerRadius="6" />
<labs:Shimmer Grid.Row="2" CornerRadius="6" />
<labs:Shimmer Grid.Row="4" CornerRadius="6" />
<labs:Shimmer Grid.Row="6" CornerRadius="6" />
</Grid>
<ProgressRing IsActive="{x:Bind ViewModel.IsDataLoading, Mode=OneWay}" />
</Grid>
<VisualStateManager.VisualStateGroups>
<VisualStateGroup x:Name="PlaybackOrderState">
<VisualState x:Name="RepeatAll">
<VisualState.StateTriggers>
<ui:CompareStateTrigger
Comparison="Equal"
Value="{x:Bind ViewModel.AppSettings.MusicGallerySettings.PlaybackOrder, Mode=OneWay, Converter={StaticResource EnumToIntConverter}}"
To="0" />
</VisualState.StateTriggers>
<VisualState.Setters>
<Setter Target="PlaybackRepeatAll.Opacity" Value="1" />
<Setter Target="PlaybackRepeatOne.Opacity" Value="0" />
<Setter Target="PlaybackShuffle.Opacity" Value="0" />
<Setter Target="PlaybackRepeatAllHint.Visibility" Value="Visible" />
<Setter Target="PlaybackRepeatOneHint.Visibility" Value="Collapsed" />
<Setter Target="PlaybackShuffleHint.Visibility" Value="Collapsed" />
</VisualState.Setters>
</VisualState>
<VisualState x:Name="RepeatOne">
<VisualState.StateTriggers>
<ui:CompareStateTrigger
Comparison="Equal"
Value="{x:Bind ViewModel.AppSettings.MusicGallerySettings.PlaybackOrder, Mode=OneWay, Converter={StaticResource EnumToIntConverter}}"
To="1" />
</VisualState.StateTriggers>
<VisualState.Setters>
<Setter Target="PlaybackRepeatAll.Opacity" Value="0" />
<Setter Target="PlaybackRepeatOne.Opacity" Value="1" />
<Setter Target="PlaybackShuffle.Opacity" Value="0" />
<Setter Target="PlaybackRepeatAllHint.Visibility" Value="Collapsed" />
<Setter Target="PlaybackRepeatOneHint.Visibility" Value="Visible" />
<Setter Target="PlaybackShuffleHint.Visibility" Value="Collapsed" />
</VisualState.Setters>
</VisualState>
<VisualState x:Name="Shuffle">
<VisualState.StateTriggers>
<ui:CompareStateTrigger
Comparison="Equal"
Value="{x:Bind ViewModel.AppSettings.MusicGallerySettings.PlaybackOrder, Mode=OneWay, Converter={StaticResource EnumToIntConverter}}"
To="2" />
</VisualState.StateTriggers>
<VisualState.Setters>
<Setter Target="PlaybackRepeatAll.Opacity" Value="0" />
<Setter Target="PlaybackRepeatOne.Opacity" Value="0" />
<Setter Target="PlaybackShuffle.Opacity" Value="1" />
<Setter Target="PlaybackRepeatAllHint.Visibility" Value="Collapsed" />
<Setter Target="PlaybackRepeatOneHint.Visibility" Value="Collapsed" />
<Setter Target="PlaybackShuffleHint.Visibility" Value="Visible" />
</VisualState.Setters>
</VisualState>
</VisualStateGroup>
</VisualStateManager.VisualStateGroups>
</Grid> </Grid>
</Page> </Page>

Some files were not shown because too many files have changed in this diff Show More