更新字号调整、全局歌词偏移

This commit is contained in:
LanZhan
2026-04-28 01:14:16 +08:00
parent 0ffae991d2
commit e2a3bbd911
23 changed files with 897 additions and 272 deletions

View File

@@ -0,0 +1,83 @@
using System.Globalization;
using Microsoft.Graphics.Canvas.Text;
using Microsoft.UI.Text;
using Microsoft.UI.Xaml.Media;
using UntamedMusicPlayer.Models;
using Windows.UI.Text;
using ZLinq;
namespace UntamedMusicPlayer.Helpers;
public static class FontHelper
{
private static List<FontFamilyInfo>? _systemFontFamilies;
private static List<FontWeightInfo>? _FontWeights;
public static List<FontFamilyInfo> GetSystemFontFamilies()
{
if (_systemFontFamilies is not null)
{
return _systemFontFamilies;
}
var language = new string[] { CultureInfo.CurrentUICulture.Name.ToLowerInvariant() };
var names = CanvasTextFormat.GetSystemFontFamilies();
var displayNames = CanvasTextFormat.GetSystemFontFamilies(language);
var list = new List<FontFamilyInfo>();
for (var i = 0; i < names.Length; i++)
{
list.Add(
new FontFamilyInfo
{
Name = names[i],
DisplayName = displayNames[i],
FontFamily = new FontFamily(names[i]),
}
);
}
_systemFontFamilies = [.. list.AsValueEnumerable().OrderBy(f => f.Name)];
return _systemFontFamilies;
}
public static List<FontWeightInfo> GetFontWeights()
{
if (_FontWeights is not null)
{
return _FontWeights;
}
var names = "Settings_FontWeights".GetLocalized().Split(", ");
_FontWeights =
[
new() { DisplayName = names[0], FontWeight = FontWeights.Thin },
new() { DisplayName = names[1], FontWeight = FontWeights.ExtraLight },
new() { DisplayName = names[2], FontWeight = FontWeights.Light },
new() { DisplayName = names[3], FontWeight = FontWeights.SemiLight },
new() { DisplayName = names[4], FontWeight = FontWeights.Normal },
new() { DisplayName = names[5], FontWeight = FontWeights.Medium },
new() { DisplayName = names[6], FontWeight = FontWeights.SemiBold },
new() { DisplayName = names[7], FontWeight = FontWeights.Bold },
new() { DisplayName = names[8], FontWeight = FontWeights.ExtraBold },
new() { DisplayName = names[9], FontWeight = FontWeights.Black },
new() { DisplayName = names[10], FontWeight = FontWeights.ExtraBlack },
];
return _FontWeights;
}
public static FontWeight ConvertToFontWeight(ushort weight)
{
return weight switch
{
100 => FontWeights.Thin,
200 => FontWeights.ExtraLight,
300 => FontWeights.Light,
350 => FontWeights.SemiLight,
400 => FontWeights.Normal,
500 => FontWeights.Medium,
600 => FontWeights.SemiBold,
700 => FontWeights.Bold,
800 => FontWeights.ExtraBold,
900 => FontWeights.Black,
950 => FontWeights.ExtraBlack,
_ => FontWeights.Normal,
};
}
}

View File

@@ -3,6 +3,7 @@ using CommunityToolkit.Mvvm.Messaging;
using Microsoft.UI.Dispatching;
using UntamedMusicPlayer.Helpers;
using UntamedMusicPlayer.Messages;
using UntamedMusicPlayer.Models;
using UntamedMusicPlayer.Playback;
namespace UntamedMusicPlayer.LyricRenderer;
@@ -10,6 +11,7 @@ namespace UntamedMusicPlayer.LyricRenderer;
public sealed partial class LyricManager
: ObservableRecipient,
IRecipient<FontSizeChangeMessage>,
IRecipient<LyricOffsetChangeMessage>,
IDisposable
{
private readonly DispatcherQueue _dispatcher = DispatcherQueue.GetForCurrentThread();
@@ -28,9 +30,25 @@ public sealed partial class LyricManager
public partial string CurrentLyricContent { get; set; } = "";
/// <summary>
/// 歌词偏移毫秒数,正数表示歌词显示延后,负数表示歌词显示提前
/// 全局歌词偏移毫秒数,正数表示歌词显示延后,负数表示歌词显示提前
/// </summary>
public double LyricAdjustMilliseconds { get; set; } = 0;
private double _globalLyricOffset = Settings.GlobalLyricOffset;
/// <summary>
/// 是否已手动调整(手动调整后将脱离全局偏移控制)
/// </summary>
private bool _isManuallyAdjusted = false;
/// <summary>
/// 手动调整的歌词偏移毫秒数
/// </summary>
private double _manualLyricOffset = 0;
/// <summary>
/// 总偏移毫秒数
/// </summary>
private double TotalLyricOffset =>
_isManuallyAdjusted ? _manualLyricOffset : _globalLyricOffset;
/// <summary>
/// 歌词偏移显示字符串
@@ -47,7 +65,8 @@ public sealed partial class LyricManager
public LyricManager(SharedPlaybackState state)
: base(StrongReferenceMessenger.Default)
{
Messenger.Register(this);
Messenger.Register<FontSizeChangeMessage>(this);
Messenger.Register<LyricOffsetChangeMessage>(this);
_state = state;
}
@@ -59,6 +78,15 @@ public sealed partial class LyricManager
}
}
public void Receive(LyricOffsetChangeMessage message)
{
_globalLyricOffset = message.OffsetMilliseconds;
if (!_isManuallyAdjusted)
{
UpdateLyricAdjustDisplay();
}
}
/// <summary>
/// 获取当前歌曲歌词
/// </summary>
@@ -73,6 +101,9 @@ public sealed partial class LyricManager
{
CurrentLyricSlices = slices;
CurrentLyricIndex = 0;
_isManuallyAdjusted = false;
_manualLyricOffset = 0;
UpdateLyricAdjustDisplay();
if (CurrentLyricSlices.Count > 0)
{
@@ -94,9 +125,10 @@ public sealed partial class LyricManager
/// <returns></returns>
public int GetCurrentLyricIndex(double currentTime)
{
var offset = TotalLyricOffset;
for (var i = 0; i < CurrentLyricSlices.Count; i++)
{
if (CurrentLyricSlices[i].StartTime > currentTime)
if (CurrentLyricSlices[i].StartTime + offset > currentTime)
{
return i > 0 ? i - 1 : 0;
}
@@ -139,38 +171,35 @@ public sealed partial class LyricManager
});
}
public async Task AddLyricAdjust()
public Task AddLyricAdjust()
{
LyricAdjustMilliseconds += 300;
LyricAdjustDisplayStr =
LyricAdjustMilliseconds == 0
? "0.0s"
: $"{(LyricAdjustMilliseconds > 0 ? "+" : "-")}{Math.Abs(LyricAdjustMilliseconds) / 1000:F1}s";
await Task.Run(() =>
if (!_isManuallyAdjusted)
{
foreach (var slice in CurrentLyricSlices)
{
slice.StartTime += 300;
slice.EndTime += 300;
}
});
_manualLyricOffset = _globalLyricOffset;
_isManuallyAdjusted = true;
}
_manualLyricOffset += 300;
UpdateLyricAdjustDisplay();
return Task.CompletedTask;
}
public async Task SubtractLyricAdjust()
public Task SubtractLyricAdjust()
{
LyricAdjustMilliseconds -= 300;
LyricAdjustDisplayStr =
LyricAdjustMilliseconds == 0
? "0.0s"
: $"{(LyricAdjustMilliseconds > 0 ? "+" : "-")}{Math.Abs(LyricAdjustMilliseconds) / 1000:F1}s";
await Task.Run(() =>
if (!_isManuallyAdjusted)
{
foreach (var slice in CurrentLyricSlices)
{
slice.StartTime = Math.Max(0, slice.StartTime - 300);
slice.EndTime = Math.Max(0, slice.EndTime - 300);
}
});
_manualLyricOffset = _globalLyricOffset;
_isManuallyAdjusted = true;
}
_manualLyricOffset -= 300;
UpdateLyricAdjustDisplay();
return Task.CompletedTask;
}
private void UpdateLyricAdjustDisplay()
{
var total = TotalLyricOffset;
LyricAdjustDisplayStr =
total == 0 ? "0.0s" : $"{(total > 0 ? "+" : "-")}{Math.Abs(total) / 1000:F1}s";
}
/// <summary>
@@ -182,8 +211,9 @@ public sealed partial class LyricManager
{
CurrentLyricIndex = 0;
CurrentLyricContent = "";
LyricAdjustMilliseconds = 0;
LyricAdjustDisplayStr = "0.0s";
_isManuallyAdjusted = false;
_manualLyricOffset = 0;
UpdateLyricAdjustDisplay();
CurrentLyricSlices.Clear();
});
}
@@ -191,6 +221,7 @@ public sealed partial class LyricManager
public void Dispose()
{
Messenger.Unregister<FontSizeChangeMessage>(this);
Messenger.Unregister<LyricOffsetChangeMessage>(this);
GC.SuppressFinalize(this);
}
}

View File

@@ -0,0 +1,6 @@
namespace UntamedMusicPlayer.Messages;
public sealed class LyricOffsetChangeMessage(int offsetMilliseconds)
{
public int OffsetMilliseconds { get; } = offsetMilliseconds;
}

View File

@@ -1,10 +1,17 @@
using Microsoft.UI.Xaml.Media;
using Windows.UI.Text;
namespace UntamedMusicPlayer.Models;
public sealed class FontInfo
public sealed class FontFamilyInfo
{
public string Name { get; set; } = null!;
public string DisplayName { get; set; } = null!;
public FontFamily FontFamily { get; set; } = null!;
}
public sealed class FontWeightInfo
{
public string DisplayName { get; set; } = null!;
public FontWeight FontWeight { get; set; }
}

View File

@@ -1,7 +1,10 @@
using Microsoft.UI.Text;
using Microsoft.UI.Xaml;
using Microsoft.UI.Xaml.Media;
using UntamedMusicPlayer.Contracts.Services;
using UntamedMusicPlayer.Helpers;
using Windows.UI;
using Windows.UI.Text;
namespace UntamedMusicPlayer.Models;
@@ -93,6 +96,38 @@ public static class Settings
}
public static double LyricPageNotCurrentFontSize { get; set; }
/// <summary>
/// 歌词字重
/// </summary>
public static FontWeight LyricPageFontWeight
{
get;
set
{
if (field != value)
{
field = value;
_localSettingsService.SaveSettingAsync(nameof(LyricPageFontWeight), value.Weight);
}
}
}
/// <summary>
/// 全局歌词时间偏移
/// </summary>
public static int GlobalLyricOffset
{
get;
set
{
if (field != value)
{
field = value;
_localSettingsService.SaveSettingAsync(nameof(GlobalLyricOffset), value);
}
}
}
/// <summary>
/// 应用主题
/// </summary>
@@ -269,6 +304,14 @@ public static class Settings
await _localSettingsService.ReadSettingAsync<string>(nameof(FontFamily))
?? "Microsoft YaHei"
);
var fontWeight = await _localSettingsService.ReadSettingAsync<ushort>(
nameof(LyricPageFontWeight)
);
LyricPageFontWeight =
fontWeight == 0 ? FontWeights.Normal : FontHelper.ConvertToFontWeight(fontWeight);
GlobalLyricOffset = await _localSettingsService.ReadSettingAsync<int>(
nameof(GlobalLyricOffset)
);
var themeName = await _localSettingsService.ReadSettingAsync<string>(nameof(Theme));
Theme = Enum.TryParse<ElementTheme>(themeName, out var cacheTheme)
? cacheTheme

View File

@@ -1,52 +1,110 @@
<?xml version='1.0' encoding='utf-8'?>
<root xmlns:ns1="urn:schemas-microsoft-com:xml-msdata" xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:schema id="root">
<xs:import namespace="http://www.w3.org/XML/1998/namespace" />
<xs:element name="root" ns1:IsDataSet="true">
<xs:complexType>
<xs:choice maxOccurs="unbounded">
<xs:element name="metadata">
<xs:complexType>
<xs:sequence>
<xs:element name="value" type="xsd:string" minOccurs="0" />
</xs:sequence>
<xs:attribute name="name" use="required" type="xsd:string" />
<xs:attribute name="type" type="xsd:string" />
<xs:attribute name="mimetype" type="xsd:string" />
<xs:attribute ref="xml:space" />
</xs:complexType>
</xs:element>
<xs:element name="assembly">
<xs:complexType>
<xs:attribute name="alias" type="xsd:string" />
<xs:attribute name="name" type="xsd:string" />
</xs:complexType>
</xs:element>
<xs:element name="data">
<xs:complexType>
<xs:sequence>
<xs:element name="value" type="xsd:string" minOccurs="0" ns1:Ordinal="1" />
<xs:element name="comment" type="xsd:string" minOccurs="0" ns1:Ordinal="2" />
</xs:sequence>
<xs:attribute name="name" type="xsd:string" use="required" ns1:Ordinal="1" />
<xs:attribute name="type" type="xsd:string" ns1:Ordinal="3" />
<xs:attribute name="mimetype" type="xsd:string" ns1:Ordinal="4" />
<xs:attribute ref="xml:space" />
</xs:complexType>
</xs:element>
<xs:element name="resheader">
<xs:complexType>
<xs:sequence>
<xs:element name="value" type="xsd:string" minOccurs="0" ns1:Ordinal="1" />
</xs:sequence>
<xs:attribute name="name" type="xsd:string" use="required" />
</xs:complexType>
</xs:element>
</xs:choice>
</xs:complexType>
</xs:element>
</xs:schema>
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
@@ -116,9 +174,6 @@
<data name="Settings_MusicLibraryLocation.Header" xml:space="preserve">
<value>مواقع مكتبة الموسيقى</value>
</data>
<data name="Settings_LyricPreview.Header" xml:space="preserve">
<value>معاينة كلمات الأغنية</value>
</data>
<data name="Settings_NoFolder.Text" xml:space="preserve">
<value>لا توجد مجلدات مدرجة في هذه المكتبة.</value>
</data>
@@ -497,12 +552,9 @@
<data name="Settings_ChooseAMaterial.PlaceholderText" xml:space="preserve">
<value>اختر مادة</value>
</data>
<data name="Settings_LyricFontFamily.Header" xml:space="preserve">
<data name="Settings_LyricFont.Header" xml:space="preserve">
<value>عائلة خطوط الكلمات</value>
</data>
<data name="Settings_LyricFontSize.Header" xml:space="preserve">
<value>حجم خط الكلمات</value>
</data>
<data name="Settings_ChooseAFontFamily.PlaceholderText" xml:space="preserve">
<value>اختر عائلة الخطوط</value>
</data>
@@ -983,4 +1035,31 @@
<data name="Lyric_SlowDownLyric.ToolTipService.ToolTip" xml:space="preserve">
<value>إبطاء كلمات الأغنية بمقدار 0.3 ثانية</value>
</data>
<data name="Settings_LyricFontSize.Header" xml:space="preserve">
<value>حجم الخط</value>
</data>
<data name="Settings_LyricPreview.Header" xml:space="preserve">
<value>معاينة</value>
</data>
<data name="Settings_LyricFontFamily.Header" xml:space="preserve">
<value>عائلة فونت</value>
</data>
<data name="Settings_LyricOffset.Header" xml:space="preserve">
<value>أوفست الكلمات العالمية</value>
</data>
<data name="Settings_LyricOffset.Description" xml:space="preserve">
<value>القيم السلبية ستدفع الكلمات إلى الأمام، بينما القيم الإيجابية ستؤخرها</value>
</data>
<data name="Settings_Millisecond.Text" xml:space="preserve">
<value>ميلي ثانية</value>
</data>
<data name="Settings_FontWeights" xml:space="preserve">
<value>رفيع ,خفيف للغاية ,خفيف ,خفيف شبه ,عادي ,متوسط ,شبه عريض ,عريض ,عريض للغاية ,أسود ,أسود للغاية</value>
</data>
<data name="Settings_ChooseAFontWeight.PlaceholderText" xml:space="preserve">
<value>اختر وزن الخط</value>
</data>
<data name="Settings_LyricFontWeight.Header" xml:space="preserve">
<value>وزن الخط</value>
</data>
</root>

View File

@@ -116,9 +116,6 @@
<data name="Settings_MusicLibraryLocation.Header" xml:space="preserve">
<value>সঙ্গীত গ্রন্থাগারের অবস্থান</value>
</data>
<data name="Settings_LyricPreview.Header" xml:space="preserve">
<value>লিরিক প্রিভিউ</value>
</data>
<data name="Settings_NoFolder.Text" xml:space="preserve">
<value>এই লাইব্রেরিতে কোন ফোল্ডার অন্তর্ভুক্ত নেই।</value>
</data>
@@ -497,12 +494,9 @@
<data name="Settings_ChooseAMaterial.PlaceholderText" xml:space="preserve">
<value>একটি উপাদান চয়ন করুন</value>
</data>
<data name="Settings_LyricFontFamily.Header" xml:space="preserve">
<data name="Settings_LyricFont.Header" xml:space="preserve">
<value>লিরিক ফন্ট-ফ্যামিলি</value>
</data>
<data name="Settings_LyricFontSize.Header" xml:space="preserve">
<value>লিরিক ফন্ট-আকার</value>
</data>
<data name="Settings_ChooseAFontFamily.PlaceholderText" xml:space="preserve">
<value>একটি ফন্ট-পরিবার চয়ন করুন</value>
</data>
@@ -983,4 +977,31 @@
<data name="Lyric_SlowDownLyric.ToolTipService.ToolTip" xml:space="preserve">
<value>গানের কথা 0.3 সেকেন্ড ধীর করুন</value>
</data>
<data name="Settings_LyricFontSize.Header" xml:space="preserve">
<value>ফন্টের আকার</value>
</data>
<data name="Settings_LyricPreview.Header" xml:space="preserve">
<value>পূর্বরূপ</value>
</data>
<data name="Settings_LyricFontFamily.Header" xml:space="preserve">
<value>ফন্ট পরিবার</value>
</data>
<data name="Settings_LyricOffset.Header" xml:space="preserve">
<value>গ্লোবাল লিরিক অফসেট</value>
</data>
<data name="Settings_LyricOffset.Description" xml:space="preserve">
<value>নেতিবাচক মানগুলি গানের কথাকে এগিয়ে নিয়ে যাবে, যখন ইতিবাচক মানগুলি তাদের বিলম্বিত করবে</value>
</data>
<data name="Settings_Millisecond.Text" xml:space="preserve">
<value>মিলিসেকেন্ড</value>
</data>
<data name="Settings_FontWeights" xml:space="preserve">
<value>পাতলা, অতিরিক্ত আলো, হালকা, আধা হালকা, নিয়মিত, মাঝারি, আধা বোল্ড, গাঢ়, অতিরিক্ত গাঢ়, কালো, অতিরিক্ত কালো</value>
</data>
<data name="Settings_ChooseAFontWeight.PlaceholderText" xml:space="preserve">
<value>একটি ফন্ট-ওজন চয়ন করুন</value>
</data>
<data name="Settings_LyricFontWeight.Header" xml:space="preserve">
<value>ফন্টের ওজন</value>
</data>
</root>

View File

@@ -116,9 +116,6 @@
<data name="Settings_MusicLibraryLocation.Header" xml:space="preserve">
<value>Standorte für Musikbibliotheken</value>
</data>
<data name="Settings_LyricPreview.Header" xml:space="preserve">
<value>Lyric-Vorschau</value>
</data>
<data name="Settings_NoFolder.Text" xml:space="preserve">
<value>In dieser Bibliothek sind keine Ordner enthalten.</value>
</data>
@@ -497,12 +494,9 @@
<data name="Settings_ChooseAMaterial.PlaceholderText" xml:space="preserve">
<value>Wählen Sie ein Material aus</value>
</data>
<data name="Settings_LyricFontFamily.Header" xml:space="preserve">
<data name="Settings_LyricFont.Header" xml:space="preserve">
<value>Lyrische Schriftfamilie</value>
</data>
<data name="Settings_LyricFontSize.Header" xml:space="preserve">
<value>Lyric-Schriftgröße</value>
</data>
<data name="Settings_ChooseAFontFamily.PlaceholderText" xml:space="preserve">
<value>Wählen Sie eine Schriftartfamilie</value>
</data>
@@ -983,4 +977,31 @@
<data name="Lyric_SlowDownLyric.ToolTipService.ToolTip" xml:space="preserve">
<value>Verlangsamen Sie die Texte um 0,3 Sekunden</value>
</data>
<data name="Settings_LyricFontSize.Header" xml:space="preserve">
<value>Schriftgröße</value>
</data>
<data name="Settings_LyricPreview.Header" xml:space="preserve">
<value>Vorschau</value>
</data>
<data name="Settings_LyricFontFamily.Header" xml:space="preserve">
<value>Schriftartfamilie</value>
</data>
<data name="Settings_LyricOffset.Header" xml:space="preserve">
<value>Globaler lyrischer Offset</value>
</data>
<data name="Settings_LyricOffset.Description" xml:space="preserve">
<value>Negative Werte bringen den Text voran, während positive Werte sie verzögern</value>
</data>
<data name="Settings_Millisecond.Text" xml:space="preserve">
<value>Millisekunden</value>
</data>
<data name="Settings_FontWeights" xml:space="preserve">
<value>Dünn, Extra Leicht, Leicht, Halbleicht, Normal, Mittel, Halb Kräftig, Kräftig, Extra Kräftig, Schwarz, Extra Schwarz</value>
</data>
<data name="Settings_ChooseAFontWeight.PlaceholderText" xml:space="preserve">
<value>Wählen Sie eine Schriftstärke</value>
</data>
<data name="Settings_LyricFontWeight.Header" xml:space="preserve">
<value>Schriftstärke</value>
</data>
</root>

View File

@@ -174,9 +174,6 @@
<data name="Settings_MusicLibraryLocation.Header" xml:space="preserve">
<value>Music library locations</value>
</data>
<data name="Settings_LyricPreview.Header" xml:space="preserve">
<value>Lyric preview</value>
</data>
<data name="Settings_NoFolder.Text" xml:space="preserve">
<value>No folders are included in this library.</value>
</data>
@@ -555,11 +552,8 @@
<data name="Settings_ChooseAMaterial.PlaceholderText" xml:space="preserve">
<value>Choose a material</value>
</data>
<data name="Settings_LyricFontFamily.Header" xml:space="preserve">
<value>Lyric font-family</value>
</data>
<data name="Settings_LyricFontSize.Header" xml:space="preserve">
<value>Lyric font-size</value>
<data name="Settings_LyricFont.Header" xml:space="preserve">
<value>Lyric font</value>
</data>
<data name="Settings_ChooseAFontFamily.PlaceholderText" xml:space="preserve">
<value>Choose a font-family</value>
@@ -1041,4 +1035,31 @@
<data name="Lyric_SlowDownLyric.ToolTipService.ToolTip" xml:space="preserve">
<value>Slow down lyrics by 0.3s</value>
</data>
<data name="Settings_LyricFontSize.Header" xml:space="preserve">
<value>Size</value>
</data>
<data name="Settings_LyricPreview.Header" xml:space="preserve">
<value>Preview</value>
</data>
<data name="Settings_LyricFontFamily.Header" xml:space="preserve">
<value>Family</value>
</data>
<data name="Settings_LyricOffset.Header" xml:space="preserve">
<value>Global Lyric Offset</value>
</data>
<data name="Settings_LyricOffset.Description" xml:space="preserve">
<value>Negative values will advance the lyrics, while positive values will delay them</value>
</data>
<data name="Settings_Millisecond.Text" xml:space="preserve">
<value>ms</value>
</data>
<data name="Settings_FontWeights" xml:space="preserve">
<value>Thin, Extra Light, Light, Semi Light, Regular, Medium, Semi Bold, Bold, Extra Bold, Black, Extra Black</value>
</data>
<data name="Settings_ChooseAFontWeight.PlaceholderText" xml:space="preserve">
<value>Choose a font-weight</value>
</data>
<data name="Settings_LyricFontWeight.Header" xml:space="preserve">
<value>Weight</value>
</data>
</root>

View File

@@ -116,9 +116,6 @@
<data name="Settings_MusicLibraryLocation.Header" xml:space="preserve">
<value>Ubicaciones de la biblioteca musical</value>
</data>
<data name="Settings_LyricPreview.Header" xml:space="preserve">
<value>Avance de la letra</value>
</data>
<data name="Settings_NoFolder.Text" xml:space="preserve">
<value>No se incluyen carpetas en esta biblioteca.</value>
</data>
@@ -497,12 +494,9 @@
<data name="Settings_ChooseAMaterial.PlaceholderText" xml:space="preserve">
<value>Elige un material</value>
</data>
<data name="Settings_LyricFontFamily.Header" xml:space="preserve">
<data name="Settings_LyricFont.Header" xml:space="preserve">
<value>Familia de fuentes líricas</value>
</data>
<data name="Settings_LyricFontSize.Header" xml:space="preserve">
<value>Tamaño de fuente de la letra</value>
</data>
<data name="Settings_ChooseAFontFamily.PlaceholderText" xml:space="preserve">
<value>Elige una familia de fuentes</value>
</data>
@@ -983,4 +977,31 @@
<data name="Lyric_SlowDownLyric.ToolTipService.ToolTip" xml:space="preserve">
<value>Ralentiza la letra en 0,3 segundos</value>
</data>
<data name="Settings_LyricFontSize.Header" xml:space="preserve">
<value>Tamaño de fuente</value>
</data>
<data name="Settings_LyricPreview.Header" xml:space="preserve">
<value>Avance</value>
</data>
<data name="Settings_LyricFontFamily.Header" xml:space="preserve">
<value>Familia de fuentes</value>
</data>
<data name="Settings_LyricOffset.Header" xml:space="preserve">
<value>Offset lírico global</value>
</data>
<data name="Settings_LyricOffset.Description" xml:space="preserve">
<value>Los valores negativos avanzan la letra, mientras que los positivos la retrasan</value>
</data>
<data name="Settings_Millisecond.Text" xml:space="preserve">
<value>milisegundos</value>
</data>
<data name="Settings_FontWeights" xml:space="preserve">
<value>Fino, Extra Claro, Ligero, Semi Claro, Normal, Medio, Semi Negrita, Negrita, Extra Negro, Extra Negro</value>
</data>
<data name="Settings_ChooseAFontWeight.PlaceholderText" xml:space="preserve">
<value>Elige un grosor de fuente</value>
</data>
<data name="Settings_LyricFontWeight.Header" xml:space="preserve">
<value>Grosor de fuente</value>
</data>
</root>

View File

@@ -116,9 +116,6 @@
<data name="Settings_MusicLibraryLocation.Header" xml:space="preserve">
<value>Emplacements de la bibliothèque musicale</value>
</data>
<data name="Settings_LyricPreview.Header" xml:space="preserve">
<value>Aperçu des paroles</value>
</data>
<data name="Settings_NoFolder.Text" xml:space="preserve">
<value>Aucun dossier nest inclus dans cette bibliothèque.</value>
</data>
@@ -497,12 +494,9 @@
<data name="Settings_ChooseAMaterial.PlaceholderText" xml:space="preserve">
<value>Choisissez un matériau</value>
</data>
<data name="Settings_LyricFontFamily.Header" xml:space="preserve">
<data name="Settings_LyricFont.Header" xml:space="preserve">
<value>Famille de polices lyriques</value>
</data>
<data name="Settings_LyricFontSize.Header" xml:space="preserve">
<value>Taille de police des paroles</value>
</data>
<data name="Settings_ChooseAFontFamily.PlaceholderText" xml:space="preserve">
<value>Choisissez une famille de polices</value>
</data>
@@ -983,4 +977,31 @@
<data name="Lyric_SlowDownLyric.ToolTipService.ToolTip" xml:space="preserve">
<value>Ralentissez les paroles de 0,3 s</value>
</data>
<data name="Settings_LyricFontSize.Header" xml:space="preserve">
<value>Taille de police</value>
</data>
<data name="Settings_LyricPreview.Header" xml:space="preserve">
<value>Aperçu</value>
</data>
<data name="Settings_LyricFontFamily.Header" xml:space="preserve">
<value>Famille de polices</value>
</data>
<data name="Settings_LyricOffset.Header" xml:space="preserve">
<value>Décalage lyrique global</value>
</data>
<data name="Settings_LyricOffset.Description" xml:space="preserve">
<value>Les valeurs négatives feront avancer les paroles, tandis que les valeurs positives les retarderont</value>
</data>
<data name="Settings_Millisecond.Text" xml:space="preserve">
<value>Millisecondes</value>
</data>
<data name="Settings_FontWeights" xml:space="preserve">
<value>Léger, Extra Léger, Léger, Semi-Léger, Régulier, Moyen, Semi-Grasset, Gras, Extra Gros, Noir, Extra Noir</value>
</data>
<data name="Settings_ChooseAFontWeight.PlaceholderText" xml:space="preserve">
<value>Choisissez un poids de police</value>
</data>
<data name="Settings_LyricFontWeight.Header" xml:space="preserve">
<value>Épaisseur de police</value>
</data>
</root>

View File

@@ -116,9 +116,6 @@
<data name="Settings_MusicLibraryLocation.Header" xml:space="preserve">
<value>संगीत पुस्तकालय स्थान</value>
</data>
<data name="Settings_LyricPreview.Header" xml:space="preserve">
<value>गीत पूर्वावलोकन</value>
</data>
<data name="Settings_NoFolder.Text" xml:space="preserve">
<value>इस लायब्रेरी में कोई फ़ोल्डर शामिल नहीं हैं.</value>
</data>
@@ -497,12 +494,9 @@
<data name="Settings_ChooseAMaterial.PlaceholderText" xml:space="preserve">
<value>एक सामग्री चुनें</value>
</data>
<data name="Settings_LyricFontFamily.Header" xml:space="preserve">
<data name="Settings_LyricFont.Header" xml:space="preserve">
<value>गीत फ़ॉन्ट-परिवार</value>
</data>
<data name="Settings_LyricFontSize.Header" xml:space="preserve">
<value>गीत फ़ॉन्ट-आकार</value>
</data>
<data name="Settings_ChooseAFontFamily.PlaceholderText" xml:space="preserve">
<value>कोई फ़ॉन्ट-परिवार चुनें</value>
</data>
@@ -983,4 +977,31 @@
<data name="Lyric_SlowDownLyric.ToolTipService.ToolTip" xml:space="preserve">
<value>गीत को 0.3s से धीमा करें</value>
</data>
<data name="Settings_LyricFontSize.Header" xml:space="preserve">
<value>फ़ॉन्ट आकार</value>
</data>
<data name="Settings_LyricPreview.Header" xml:space="preserve">
<value>पूर्वसमीक्षा</value>
</data>
<data name="Settings_LyricFontFamily.Header" xml:space="preserve">
<value>फ़ॉन्ट परिवार</value>
</data>
<data name="Settings_LyricOffset.Header" xml:space="preserve">
<value>वैश्विक गीत ऑफसेट</value>
</data>
<data name="Settings_LyricOffset.Description" xml:space="preserve">
<value>नकारात्मक मूल्य गीत को आगे बढ़ाएंगे, जबकि सकारात्मक मूल्य उनमें देरी करेंगे</value>
</data>
<data name="Settings_Millisecond.Text" xml:space="preserve">
<value>मिलीसेकंड</value>
</data>
<data name="Settings_FontWeights" xml:space="preserve">
<value>पतला, अतिरिक्त प्रकाश, प्रकाश, अर्ध प्रकाश, नियमित, मध्यम, अर्ध बोल्ड, बोल्ड, अतिरिक्त बोल्ड, काला, अतिरिक्त काला</value>
</data>
<data name="Settings_ChooseAFontWeight.PlaceholderText" xml:space="preserve">
<value>फ़ॉन्ट-वेट चुनें</value>
</data>
<data name="Settings_LyricFontWeight.Header" xml:space="preserve">
<value>फ़ॉन्ट वजन</value>
</data>
</root>

View File

@@ -116,9 +116,6 @@
<data name="Settings_MusicLibraryLocation.Header" xml:space="preserve">
<value>Lokasi perpustakaan musik</value>
</data>
<data name="Settings_LyricPreview.Header" xml:space="preserve">
<value>Pratinjau lirik</value>
</data>
<data name="Settings_NoFolder.Text" xml:space="preserve">
<value>Tidak ada folder yang disertakan dalam perpustakaan ini.</value>
</data>
@@ -497,12 +494,9 @@
<data name="Settings_ChooseAMaterial.PlaceholderText" xml:space="preserve">
<value>Pilih bahan</value>
</data>
<data name="Settings_LyricFontFamily.Header" xml:space="preserve">
<data name="Settings_LyricFont.Header" xml:space="preserve">
<value>Keluarga font lirik</value>
</data>
<data name="Settings_LyricFontSize.Header" xml:space="preserve">
<value>Ukuran font lirik</value>
</data>
<data name="Settings_ChooseAFontFamily.PlaceholderText" xml:space="preserve">
<value>Pilih keluarga font</value>
</data>
@@ -983,4 +977,31 @@
<data name="Lyric_SlowDownLyric.ToolTipService.ToolTip" xml:space="preserve">
<value>Perlambat lirik sebesar 0,3 detik</value>
</data>
<data name="Settings_LyricFontSize.Header" xml:space="preserve">
<value>Ukuran font</value>
</data>
<data name="Settings_LyricPreview.Header" xml:space="preserve">
<value>Pratinjau</value>
</data>
<data name="Settings_LyricFontFamily.Header" xml:space="preserve">
<value>Keluarga font</value>
</data>
<data name="Settings_LyricOffset.Header" xml:space="preserve">
<value>Offset Lirik Global</value>
</data>
<data name="Settings_LyricOffset.Description" xml:space="preserve">
<value>Nilai negatif akan memajukan lirik, sedangkan nilai positif akan menundanya</value>
</data>
<data name="Settings_Millisecond.Text" xml:space="preserve">
<value>milidetik</value>
</data>
<data name="Settings_FontWeights" xml:space="preserve">
<value>Tipis, Ekstra Ringan, Ringan, Semi Ringan, Biasa, Sedang, Semi Tebal, Tebal, Ekstra Tebal, Hitam, Ekstra Hitam</value>
</data>
<data name="Settings_ChooseAFontWeight.PlaceholderText" xml:space="preserve">
<value>Pilih bobot font</value>
</data>
<data name="Settings_LyricFontWeight.Header" xml:space="preserve">
<value>Berat font</value>
</data>
</root>

View File

@@ -1,52 +1,110 @@
<?xml version='1.0' encoding='utf-8'?>
<root xmlns:ns1="urn:schemas-microsoft-com:xml-msdata" xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:schema id="root">
<xs:import namespace="http://www.w3.org/XML/1998/namespace" />
<xs:element name="root" ns1:IsDataSet="true">
<xs:complexType>
<xs:choice maxOccurs="unbounded">
<xs:element name="metadata">
<xs:complexType>
<xs:sequence>
<xs:element name="value" type="xsd:string" minOccurs="0" />
</xs:sequence>
<xs:attribute name="name" use="required" type="xsd:string" />
<xs:attribute name="type" type="xsd:string" />
<xs:attribute name="mimetype" type="xsd:string" />
<xs:attribute ref="xml:space" />
</xs:complexType>
</xs:element>
<xs:element name="assembly">
<xs:complexType>
<xs:attribute name="alias" type="xsd:string" />
<xs:attribute name="name" type="xsd:string" />
</xs:complexType>
</xs:element>
<xs:element name="data">
<xs:complexType>
<xs:sequence>
<xs:element name="value" type="xsd:string" minOccurs="0" ns1:Ordinal="1" />
<xs:element name="comment" type="xsd:string" minOccurs="0" ns1:Ordinal="2" />
</xs:sequence>
<xs:attribute name="name" type="xsd:string" use="required" ns1:Ordinal="1" />
<xs:attribute name="type" type="xsd:string" ns1:Ordinal="3" />
<xs:attribute name="mimetype" type="xsd:string" ns1:Ordinal="4" />
<xs:attribute ref="xml:space" />
</xs:complexType>
</xs:element>
<xs:element name="resheader">
<xs:complexType>
<xs:sequence>
<xs:element name="value" type="xsd:string" minOccurs="0" ns1:Ordinal="1" />
</xs:sequence>
<xs:attribute name="name" type="xsd:string" use="required" />
</xs:complexType>
</xs:element>
</xs:choice>
</xs:complexType>
</xs:element>
</xs:schema>
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
@@ -116,9 +174,6 @@
<data name="Settings_MusicLibraryLocation.Header" xml:space="preserve">
<value>音楽ライブラリーの所在地</value>
</data>
<data name="Settings_LyricPreview.Header" xml:space="preserve">
<value>歌詞プレビュー</value>
</data>
<data name="Settings_NoFolder.Text" xml:space="preserve">
<value>このライブラリにはフォルダは含まれていません。</value>
</data>
@@ -497,12 +552,9 @@
<data name="Settings_ChooseAMaterial.PlaceholderText" xml:space="preserve">
<value>素材を選びましょう</value>
</data>
<data name="Settings_LyricFontFamily.Header" xml:space="preserve">
<data name="Settings_LyricFont.Header" xml:space="preserve">
<value>リリックフォントファミリー</value>
</data>
<data name="Settings_LyricFontSize.Header" xml:space="preserve">
<value>リリックフォントサイズ</value>
</data>
<data name="Settings_ChooseAFontFamily.PlaceholderText" xml:space="preserve">
<value>フォントファミリーを選ぶ</value>
</data>
@@ -983,4 +1035,31 @@
<data name="Lyric_SlowDownLyric.ToolTipService.ToolTip" xml:space="preserve">
<value>歌詞を0.3秒遅くする</value>
</data>
<data name="Settings_LyricFontSize.Header" xml:space="preserve">
<value>フォントサイズ</value>
</data>
<data name="Settings_LyricPreview.Header" xml:space="preserve">
<value>プレビュー</value>
</data>
<data name="Settings_LyricFontFamily.Header" xml:space="preserve">
<value>フォントファミリー</value>
</data>
<data name="Settings_LyricOffset.Header" xml:space="preserve">
<value>グローバル・リリック・オフセット</value>
</data>
<data name="Settings_LyricOffset.Description" xml:space="preserve">
<value>マイナスは歌詞を進め、ポジティブな方は歌詞を遅らせます</value>
</data>
<data name="Settings_Millisecond.Text" xml:space="preserve">
<value>ミリ秒単位</value>
</data>
<data name="Settings_FontWeights" xml:space="preserve">
<value>薄め, エクストラライト, ライト, セミライト, レギュラー, ミディアム, セミボールド, ボールド, エクストラボールド, ブラック, エクストラブラック</value>
</data>
<data name="Settings_ChooseAFontWeight.PlaceholderText" xml:space="preserve">
<value>フォントの太さを選ぶ</value>
</data>
<data name="Settings_LyricFontWeight.Header" xml:space="preserve">
<value>フォントの太さ</value>
</data>
</root>

View File

@@ -116,9 +116,6 @@
<data name="Settings_MusicLibraryLocation.Header" xml:space="preserve">
<value>음악 도서관 위치</value>
</data>
<data name="Settings_LyricPreview.Header" xml:space="preserve">
<value>가사 미리보기</value>
</data>
<data name="Settings_NoFolder.Text" xml:space="preserve">
<value>이 라이브러리에는 폴더가 포함되어 있지 않습니다.</value>
</data>
@@ -497,12 +494,9 @@
<data name="Settings_ChooseAMaterial.PlaceholderText" xml:space="preserve">
<value>재료를 선택하세요</value>
</data>
<data name="Settings_LyricFontFamily.Header" xml:space="preserve">
<data name="Settings_LyricFont.Header" xml:space="preserve">
<value>서정형 폰트 계열</value>
</data>
<data name="Settings_LyricFontSize.Header" xml:space="preserve">
<value>가사 글꼴 크기</value>
</data>
<data name="Settings_ChooseAFontFamily.PlaceholderText" xml:space="preserve">
<value>폰트 계열 선택</value>
</data>
@@ -983,4 +977,31 @@
<data name="Lyric_SlowDownLyric.ToolTipService.ToolTip" xml:space="preserve">
<value>가사 속도를 0.3초 늦춰</value>
</data>
<data name="Settings_LyricFontSize.Header" xml:space="preserve">
<value>글꼴 크기</value>
</data>
<data name="Settings_LyricPreview.Header" xml:space="preserve">
<value>미리보기</value>
</data>
<data name="Settings_LyricFontFamily.Header" xml:space="preserve">
<value>폰트 계열</value>
</data>
<data name="Settings_LyricOffset.Header" xml:space="preserve">
<value>글로벌 가사 상쇄</value>
</data>
<data name="Settings_LyricOffset.Description" xml:space="preserve">
<value>음수치는 가사를 진행시키고, 음수치는 가사를 지연시킵니다</value>
</data>
<data name="Settings_Millisecond.Text" xml:space="preserve">
<value>밀리초</value>
</data>
<data name="Settings_FontWeights" xml:space="preserve">
<value>씬, 엑스트라 라이트, 라이트, 세미 라이트, 레귤러, 미디엄, 세미 볼드, 볼드, 엑스트라 볼드, 블랙, 엑스트라 블랙</value>
</data>
<data name="Settings_ChooseAFontWeight.PlaceholderText" xml:space="preserve">
<value>글꼴 굵기 선택</value>
</data>
<data name="Settings_LyricFontWeight.Header" xml:space="preserve">
<value>폰트 굵기</value>
</data>
</root>

View File

@@ -116,9 +116,6 @@
<data name="Settings_MusicLibraryLocation.Header" xml:space="preserve">
<value>Localizações da biblioteca musical</value>
</data>
<data name="Settings_LyricPreview.Header" xml:space="preserve">
<value>Prévia da letra</value>
</data>
<data name="Settings_NoFolder.Text" xml:space="preserve">
<value>Nenhuma pasta está incluída nesta biblioteca.</value>
</data>
@@ -497,12 +494,9 @@
<data name="Settings_ChooseAMaterial.PlaceholderText" xml:space="preserve">
<value>Escolha um material</value>
</data>
<data name="Settings_LyricFontFamily.Header" xml:space="preserve">
<data name="Settings_LyricFont.Header" xml:space="preserve">
<value>Família de fontes líricas</value>
</data>
<data name="Settings_LyricFontSize.Header" xml:space="preserve">
<value>Tamanho da fonte da letra</value>
</data>
<data name="Settings_ChooseAFontFamily.PlaceholderText" xml:space="preserve">
<value>Escolha uma família de fontes</value>
</data>
@@ -983,4 +977,31 @@
<data name="Lyric_SlowDownLyric.ToolTipService.ToolTip" xml:space="preserve">
<value>Letra de desaceleração em 0,3s</value>
</data>
<data name="Settings_LyricFontSize.Header" xml:space="preserve">
<value>Tamanho da fonte</value>
</data>
<data name="Settings_LyricPreview.Header" xml:space="preserve">
<value>Prévia</value>
</data>
<data name="Settings_LyricFontFamily.Header" xml:space="preserve">
<value>Família de fontes</value>
</data>
<data name="Settings_LyricOffset.Header" xml:space="preserve">
<value>Offset Lírico Global</value>
</data>
<data name="Settings_LyricOffset.Description" xml:space="preserve">
<value>Valores negativos vão avançar a letra, enquanto valores positivos vão atrasá-las</value>
</data>
<data name="Settings_Millisecond.Text" xml:space="preserve">
<value>milissegundos</value>
</data>
<data name="Settings_FontWeights" xml:space="preserve">
<value>Fino, Extra Claro, Leve, Semi Claro, Normal, Médio, Semi Ogrito, Ogrito, Extra Ogrito, Preto, Preto Extra</value>
</data>
<data name="Settings_ChooseAFontWeight.PlaceholderText" xml:space="preserve">
<value>Escolha um peso de fonte</value>
</data>
<data name="Settings_LyricFontWeight.Header" xml:space="preserve">
<value>Peso da fonte</value>
</data>
</root>

View File

@@ -116,9 +116,6 @@
<data name="Settings_MusicLibraryLocation.Header" xml:space="preserve">
<value>Расположение музыкальных библиотек</value>
</data>
<data name="Settings_LyricPreview.Header" xml:space="preserve">
<value>Превью текста песен</value>
</data>
<data name="Settings_NoFolder.Text" xml:space="preserve">
<value>В этой библиотеке нет папок.</value>
</data>
@@ -497,12 +494,9 @@
<data name="Settings_ChooseAMaterial.PlaceholderText" xml:space="preserve">
<value>Выберите материал</value>
</data>
<data name="Settings_LyricFontFamily.Header" xml:space="preserve">
<data name="Settings_LyricFont.Header" xml:space="preserve">
<value>Лирическое семейство шрифтов</value>
</data>
<data name="Settings_LyricFontSize.Header" xml:space="preserve">
<value>Размер шрифта текста</value>
</data>
<data name="Settings_ChooseAFontFamily.PlaceholderText" xml:space="preserve">
<value>Выберите семейство шрифтов</value>
</data>
@@ -983,4 +977,31 @@
<data name="Lyric_SlowDownLyric.ToolTipService.ToolTip" xml:space="preserve">
<value>Замедлите текст на 0,3 секунды</value>
</data>
<data name="Settings_LyricFontSize.Header" xml:space="preserve">
<value>Размер шрифта</value>
</data>
<data name="Settings_LyricPreview.Header" xml:space="preserve">
<value>Превью</value>
</data>
<data name="Settings_LyricFontFamily.Header" xml:space="preserve">
<value>Семейство шрифтов</value>
</data>
<data name="Settings_LyricOffset.Header" xml:space="preserve">
<value>Глобальный лирический офсет</value>
</data>
<data name="Settings_LyricOffset.Description" xml:space="preserve">
<value>Отрицательные значения продвигают текст, а положительные — задерживают их</value>
</data>
<data name="Settings_Millisecond.Text" xml:space="preserve">
<value>миллисекунды</value>
</data>
<data name="Settings_FontWeights" xml:space="preserve">
<value>Тонкая, Extra Light, Light, Semi Light, Regular, Medium, Semi Bold, Bold, Extra Bold, Black, Extra Black</value>
</data>
<data name="Settings_ChooseAFontWeight.PlaceholderText" xml:space="preserve">
<value>Выберите вес шрифта</value>
</data>
<data name="Settings_LyricFontWeight.Header" xml:space="preserve">
<value>Вес шрифта</value>
</data>
</root>

View File

@@ -174,9 +174,6 @@
<data name="Settings_MusicLibraryLocation.Header" xml:space="preserve">
<value>音乐库位置</value>
</data>
<data name="Settings_LyricPreview.Header" xml:space="preserve">
<value>歌词预览</value>
</data>
<data name="Settings_NoFolder.Text" xml:space="preserve">
<value>此库中不包含任何文件夹</value>
</data>
@@ -555,12 +552,9 @@
<data name="Settings_ChooseAMaterial.PlaceholderText" xml:space="preserve">
<value>选择一个材质</value>
</data>
<data name="Settings_LyricFontFamily.Header" xml:space="preserve">
<data name="Settings_LyricFont.Header" xml:space="preserve">
<value>歌词字体</value>
</data>
<data name="Settings_LyricFontSize.Header" xml:space="preserve">
<value>歌词字号</value>
</data>
<data name="Settings_ChooseAFontFamily.PlaceholderText" xml:space="preserve">
<value>选择一种字体</value>
</data>
@@ -1041,4 +1035,31 @@
<data name="Lyric_SlowDownLyric.ToolTipService.ToolTip" xml:space="preserve">
<value>歌词延后 0.3 秒</value>
</data>
<data name="Settings_LyricFontSize.Header" xml:space="preserve">
<value>字号</value>
</data>
<data name="Settings_LyricPreview.Header" xml:space="preserve">
<value>预览</value>
</data>
<data name="Settings_LyricFontFamily.Header" xml:space="preserve">
<value>字体系列</value>
</data>
<data name="Settings_LyricOffset.Header" xml:space="preserve">
<value>全局歌词时间偏移</value>
</data>
<data name="Settings_LyricOffset.Description" xml:space="preserve">
<value>负值使歌词提前出现,正值使歌词延后出现</value>
</data>
<data name="Settings_Millisecond.Text" xml:space="preserve">
<value>毫秒</value>
</data>
<data name="Settings_FontWeights" xml:space="preserve">
<value>极细, 特细, 细, 次细, 标准, 中等, 半粗, 粗体, 特粗, 浓体, 特黑</value>
</data>
<data name="Settings_ChooseAFontWeight.PlaceholderText" xml:space="preserve">
<value>选择一个字重</value>
</data>
<data name="Settings_LyricFontWeight.Header" xml:space="preserve">
<value>字重</value>
</data>
</root>

View File

@@ -174,9 +174,6 @@
<data name="Settings_MusicLibraryLocation.Header" xml:space="preserve">
<value>音樂庫位置</value>
</data>
<data name="Settings_LyricPreview.Header" xml:space="preserve">
<value>歌詞預覽</value>
</data>
<data name="Settings_NoFolder.Text" xml:space="preserve">
<value>此庫中不包含任何資料夾</value>
</data>
@@ -555,12 +552,9 @@
<data name="Settings_ChooseAMaterial.PlaceholderText" xml:space="preserve">
<value>選擇一個材質</value>
</data>
<data name="Settings_LyricFontFamily.Header" xml:space="preserve">
<data name="Settings_LyricFont.Header" xml:space="preserve">
<value>歌詞字體</value>
</data>
<data name="Settings_LyricFontSize.Header" xml:space="preserve">
<value>歌詞字型大小</value>
</data>
<data name="Settings_ChooseAFontFamily.PlaceholderText" xml:space="preserve">
<value>選擇一種字體</value>
</data>
@@ -1041,4 +1035,31 @@
<data name="Lyric_SlowDownLyric.ToolTipService.ToolTip" xml:space="preserve">
<value>歌詞延遲 0.3 秒</value>
</data>
<data name="Settings_LyricFontSize.Header" xml:space="preserve">
<value>字號</value>
</data>
<data name="Settings_LyricPreview.Header" xml:space="preserve">
<value>預覽</value>
</data>
<data name="Settings_LyricFontFamily.Header" xml:space="preserve">
<value>字體系列</value>
</data>
<data name="Settings_LyricOffset.Header" xml:space="preserve">
<value>全局歌詞時間偏移</value>
</data>
<data name="Settings_LyricOffset.Description" xml:space="preserve">
<value>負值會推進歌詞,正面值則會延遲歌詞</value>
</data>
<data name="Settings_Millisecond.Text" xml:space="preserve">
<value>毫秒</value>
</data>
<data name="Settings_FontWeights" xml:space="preserve">
<value>極細, 特細, 細, 次細, 標準, 中等, 半粗, 粗體, 特粗, 濃體, 特黑</value>
</data>
<data name="Settings_ChooseAFontWeight.PlaceholderText" xml:space="preserve">
<value>選擇一個字重</value>
</data>
<data name="Settings_LyricFontWeight.Header" xml:space="preserve">
<value>字重</value>
</data>
</root>

View File

@@ -41,7 +41,7 @@
<PackageReference Include="RawInput.Sharp" Version="0.1.3" />
<PackageReference Include="TagLibSharp" Version="2.3.0" />
<PackageReference Include="WinUIEx" Version="2.9.0" />
<PackageReference Include="z440.atl.core" Version="7.12.0" />
<PackageReference Include="z440.atl.core" Version="7.13.0" />
<PackageReference Include="ZLinq" Version="1.5.6" />
<PackageReference Include="ZLogger" Version="2.5.10" />
</ItemGroup>

View File

@@ -1,11 +1,9 @@
using System.Diagnostics;
using System.Globalization;
using System.Reflection;
using CommunityToolkit.Mvvm.ComponentModel;
using CommunityToolkit.Mvvm.Input;
using CommunityToolkit.Mvvm.Messaging;
using Microsoft.Extensions.Logging;
using Microsoft.Graphics.Canvas.Text;
using Microsoft.UI.Xaml;
using Microsoft.UI.Xaml.Controls;
using Microsoft.UI.Xaml.Media;
@@ -18,6 +16,7 @@ using UntamedMusicPlayer.Services;
using Windows.ApplicationModel;
using Windows.Storage;
using Windows.UI;
using Windows.UI.Text;
using ZLinq;
namespace UntamedMusicPlayer.ViewModels;
@@ -82,10 +81,12 @@ public sealed partial class SettingsViewModel
/// <summary>
/// 字体列表
/// </summary>
public List<FontInfo> FontFamilies { get; set; } = [];
public List<FontFamilyInfo> FontFamilies { get; set; } = FontHelper.GetSystemFontFamilies();
public double[] FontSizes { get; set; } = [30, 35, 40, 45, 50, 55, 60, 65, 70, 75];
public List<FontWeightInfo> FontWeights { get; set; } = FontHelper.GetFontWeights();
/// <summary>
/// 选中的字体
/// </summary>
@@ -121,6 +122,26 @@ public sealed partial class SettingsViewModel
Messenger.Send(new FontSizeChangeMessage());
}
/// <summary>
/// 选中的字重
/// </summary>
[ObservableProperty]
public partial FontWeight SelectedFontWeight { get; set; } = Settings.LyricPageFontWeight;
partial void OnSelectedFontWeightChanged(FontWeight value)
{
Settings.LyricPageFontWeight = value;
}
[ObservableProperty]
public partial int GlobalLyricOffset { get; set; } = Settings.GlobalLyricOffset;
partial void OnGlobalLyricOffsetChanged(int value)
{
Settings.GlobalLyricOffset = value;
Messenger.Send(new LyricOffsetChangeMessage(value));
}
/// <summary>
/// 深浅色主题
/// </summary>
@@ -226,7 +247,6 @@ public sealed partial class SettingsViewModel
EmptyFolderMessageVisibility =
Data.MusicLibrary.Folders.Count > 0 ? Visibility.Collapsed : Visibility.Visible;
LoadSongDownloadLocationAsync();
LoadFonts();
IsExportPlaylistsButtonEnabled = Data.PlaylistLibrary.Playlists.Count > 0;
Data.SettingsViewModel = this;
}
@@ -499,7 +519,7 @@ public sealed partial class SettingsViewModel
public void FontFamilyComboBox_SelectionChanged(object _, SelectionChangedEventArgs e)
{
if (e.AddedItems.Count > 0 && e.AddedItems[0] is FontInfo selectedFont)
if (e.AddedItems.Count > 0 && e.AddedItems[0] is FontFamilyInfo selectedFont)
{
SelectedFontFamily = new FontFamily(selectedFont.Name);
}
@@ -513,6 +533,14 @@ public sealed partial class SettingsViewModel
}
}
public void FontWeightComboBox_SelectionChanged(object _, SelectionChangedEventArgs e)
{
if (e.AddedItems.Count > 0 && e.AddedItems[0] is FontWeightInfo selectedWeight)
{
SelectedFontWeight = selectedWeight.FontWeight;
}
}
public void ComboBox_TextSubmitted(ComboBox sender, ComboBoxTextSubmittedEventArgs args)
{
if (double.TryParse(args.Text, out var fontSize))
@@ -530,26 +558,6 @@ public sealed partial class SettingsViewModel
(sender as ComboBox)!.SelectedIndex = SelectedMaterial;
}
public void LoadFonts()
{
var language = new string[] { CultureInfo.CurrentUICulture.Name.ToLowerInvariant() };
var names = CanvasTextFormat.GetSystemFontFamilies();
var displayNames = CanvasTextFormat.GetSystemFontFamilies(language);
var list = new List<FontInfo>();
for (var i = 0; i < names.Length; i++)
{
list.Add(
new FontInfo
{
Name = names[i],
DisplayName = displayNames[i],
FontFamily = new FontFamily(names[i]),
}
);
}
FontFamilies = [.. list.AsValueEnumerable().OrderBy(f => f.Name)];
}
public void FontFamilyComboBox_Loaded(object sender, RoutedEventArgs _)
{
var selectedFontName = SelectedFontFamily.Source;
@@ -573,6 +581,17 @@ public sealed partial class SettingsViewModel
}
}
public void FontWeightComboBox_Loaded(object sender, RoutedEventArgs _)
{
var selectedItem = FontWeights.FirstOrDefault(weight =>
weight.FontWeight.Weight == SelectedFontWeight.Weight
);
if (selectedItem is not null)
{
(sender as ComboBox)!.SelectedItem = selectedItem;
}
}
public void OpenLoggingFolderButton_Click(object _1, RoutedEventArgs _2)
{
var logFolder = LoggingService.GetLogFolderPath();

View File

@@ -45,6 +45,7 @@
Margin="{x:Bind Margin, Mode=OneWay}"
FontFamily="{x:Bind model:Settings.FontFamily}"
FontSize="{x:Bind FontSize, Mode=OneWay}"
FontWeight="{x:Bind model:Settings.LyricPageFontWeight}"
Opacity="{x:Bind Opacity, Mode=OneWay}"
SizeChanged="TextBlock_SizeChanged"
Text="{x:Bind Content}"

View File

@@ -26,9 +26,12 @@
</Button>
</toolkit:SettingsCard>
</DataTemplate>
<DataTemplate x:Key="FontComboBoxTemplate" x:DataType="model:FontInfo">
<DataTemplate x:Key="FontFamilyComboBoxTemplate" x:DataType="model:FontFamilyInfo">
<TextBlock FontFamily="{x:Bind FontFamily}" Text="{x:Bind DisplayName}"/>
</DataTemplate>
<DataTemplate x:Key="FontWeightComboBoxTemplate" x:DataType="model:FontWeightInfo">
<TextBlock FontWeight="{x:Bind FontWeight}" Text="{x:Bind DisplayName}"/>
</DataTemplate>
</Page.Resources>
<Grid>
<Grid.RowDefinitions>
@@ -170,34 +173,56 @@
<TextBlock x:Uid="Settings_Lyric"
Margin="0,12,0,5"
Style="{StaticResource BodyStrongTextBlockStyle}"/>
<toolkit:SettingsCard x:Uid="Settings_LyricFontFamily" HeaderIcon="{ui:FontIcon FontFamily={StaticResource UntamedFontFamily}, Glyph=&#xE8D2;}">
<ComboBox x:Uid="Settings_ChooseAFontFamily"
ItemTemplate="{StaticResource FontComboBoxTemplate}"
ItemsSource="{x:Bind ViewModel.FontFamilies}"
Loaded="{x:Bind ViewModel.FontFamilyComboBox_Loaded}"
SelectionChanged="{x:Bind ViewModel.FontFamilyComboBox_SelectionChanged}"/>
</toolkit:SettingsCard>
<toolkit:SettingsExpander x:Uid="Settings_LyricFontSize" HeaderIcon="{ui:FontIcon FontFamily={StaticResource UntamedFontFamily}, Glyph=&#xE8E9;}">
<ComboBox x:Uid="Settings_ChooseAFontSize"
IsEditable="True"
ItemsSource="{x:Bind ViewModel.FontSizes}"
Loaded="{x:Bind ViewModel.FontSizeComboBox_Loaded}"
SelectionChanged="{x:Bind ViewModel.FontSizeComboBox_SelectionChanged}"
TextSubmitted="{x:Bind ViewModel.ComboBox_TextSubmitted}"/>
<toolkit:SettingsExpander x:Uid="Settings_LyricFont" HeaderIcon="{ui:FontIcon FontFamily={StaticResource UntamedFontFamily}, Glyph=&#xE8D2;}">
<toolkit:SettingsExpander.Items>
<toolkit:SettingsCard x:Uid="Settings_LyricFontFamily">
<ComboBox x:Uid="Settings_ChooseAFontFamily"
ItemTemplate="{StaticResource FontFamilyComboBoxTemplate}"
ItemsSource="{x:Bind ViewModel.FontFamilies}"
Loaded="{x:Bind ViewModel.FontFamilyComboBox_Loaded}"
SelectionChanged="{x:Bind ViewModel.FontFamilyComboBox_SelectionChanged}"/>
</toolkit:SettingsCard>
<toolkit:SettingsCard x:Uid="Settings_LyricFontSize">
<ComboBox x:Uid="Settings_ChooseAFontSize"
IsEditable="True"
ItemsSource="{x:Bind ViewModel.FontSizes}"
Loaded="{x:Bind ViewModel.FontSizeComboBox_Loaded}"
SelectionChanged="{x:Bind ViewModel.FontSizeComboBox_SelectionChanged}"
TextSubmitted="{x:Bind ViewModel.ComboBox_TextSubmitted}"/>
</toolkit:SettingsCard>
<toolkit:SettingsCard x:Uid="Settings_LyricFontWeight">
<ComboBox x:Uid="Settings_ChooseAFontWeight"
ItemTemplate="{StaticResource FontWeightComboBoxTemplate}"
ItemsSource="{x:Bind ViewModel.FontWeights}"
Loaded="{x:Bind ViewModel.FontWeightComboBox_Loaded}"
SelectionChanged="{x:Bind ViewModel.FontWeightComboBox_SelectionChanged}"/>
</toolkit:SettingsCard>
<toolkit:SettingsCard x:Uid="Settings_LyricPreview">
<StackPanel>
<TextBlock x:Uid="Settings_ThisIsAHighlightedLyric"
FontFamily="{x:Bind ViewModel.SelectedFontFamily, Mode=OneWay}"
FontSize="{x:Bind ViewModel.SelectedCurrentFontSize, Mode=OneWay}"/>
FontSize="{x:Bind ViewModel.SelectedCurrentFontSize, Mode=OneWay}"
FontWeight="{x:Bind ViewModel.SelectedFontWeight, Mode=OneWay}"/>
<TextBlock x:Uid="Settings_ThisIsAnOrdinaryLyric"
FontFamily="{x:Bind ViewModel.SelectedFontFamily, Mode=OneWay}"
FontSize="{x:Bind ViewModel.SelectedNotCurrentFontSize, Mode=OneWay}"
FontWeight="{x:Bind ViewModel.SelectedFontWeight, Mode=OneWay}"
Opacity="0.5"/>
</StackPanel>
</toolkit:SettingsCard>
</toolkit:SettingsExpander.Items>
</toolkit:SettingsExpander>
<toolkit:SettingsCard x:Uid="Settings_LyricOffset" HeaderIcon="{ui:FontIcon FontFamily={StaticResource UntamedFontFamily}, Glyph=&#xE7BC;}">
<StackPanel Orientation="Horizontal" Spacing="8">
<NumberBox LargeChange="1000" Maximum="100000"
Minimum="-100000" SmallChange="300"
SpinButtonPlacementMode="Inline"
ValidationMode="InvalidInputOverwritten"
Value="{x:Bind ViewModel.GlobalLyricOffset, Mode=TwoWay}"/>
<TextBlock x:Uid="Settings_Millisecond" VerticalAlignment="Center"/>
</StackPanel>
</toolkit:SettingsCard>
</StackPanel>
<!-- 个性化 -->