feat: phonetic, original and translated text can be displayed at the same time; support set cjk and western font family individually; phonetic and translated font size can be adjusted

This commit is contained in:
Zhe Fang
2025-10-26 22:11:44 -04:00
parent 9905d7642c
commit e5d33177d4
27 changed files with 1068 additions and 463 deletions

View File

@@ -27,8 +27,9 @@
<None Remove="Controls\AppSettingsControl.xaml" /> <None Remove="Controls\AppSettingsControl.xaml" />
<None Remove="Controls\DemoWindowGrid.xaml" /> <None Remove="Controls\DemoWindowGrid.xaml" />
<None Remove="Controls\ExtendedSlider.xaml" /> <None Remove="Controls\ExtendedSlider.xaml" />
<None Remove="Controls\FontFamilyAutoSuggestBox.xaml" />
<None Remove="Controls\LyricsSearchControl.xaml" /> <None Remove="Controls\LyricsSearchControl.xaml" />
<None Remove="Controls\LyricsSettingsControl.xaml" /> <None Remove="Controls\LyricsStyleSettingsControl.xaml" />
<None Remove="Controls\LyricsWindowSettingsControl.xaml" /> <None Remove="Controls\LyricsWindowSettingsControl.xaml" />
<None Remove="Controls\LyricsWindowSwitchControl.xaml" /> <None Remove="Controls\LyricsWindowSwitchControl.xaml" />
<None Remove="Controls\MediaSettingsControl.xaml" /> <None Remove="Controls\MediaSettingsControl.xaml" />
@@ -200,6 +201,16 @@
<CopyToOutputDirectory>Always</CopyToOutputDirectory> <CopyToOutputDirectory>Always</CopyToOutputDirectory>
</Content> </Content>
</ItemGroup> </ItemGroup>
<ItemGroup>
<Page Update="Controls\FontFamilyAutoSuggestBox.xaml">
<Generator>MSBuild:Compile</Generator>
</Page>
</ItemGroup>
<ItemGroup>
<Page Update="Controls\LyricsStyleSettingsControl.xaml">
<Generator>MSBuild:Compile</Generator>
</Page>
</ItemGroup>
<ItemGroup> <ItemGroup>
<Page Update="Views\LyricsWindowSwitchWindow.xaml"> <Page Update="Views\LyricsWindowSwitchWindow.xaml">
<Generator>MSBuild:Compile</Generator> <Generator>MSBuild:Compile</Generator>
@@ -241,7 +252,7 @@
</Page> </Page>
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<Page Update="Controls\LyricsSettingsControl.xaml"> <Page Update="Controls\LyricsEffectSettingsControl.xaml">
<Generator>MSBuild:Compile</Generator> <Generator>MSBuild:Compile</Generator>
</Page> </Page>
</ItemGroup> </ItemGroup>

View File

@@ -0,0 +1,30 @@
<?xml version="1.0" encoding="utf-8" ?>
<UserControl
x:Class="BetterLyrics.WinUI3.Controls.FontFamilyAutoSuggestBox"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
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:ui="using:CommunityToolkit.WinUI"
mc:Ignorable="d">
<Grid>
<StackPanel Orientation="Horizontal" Spacing="6">
<AutoSuggestBox
x:Name="AutoSuggestBox"
Width="150"
GotFocus="AutoSuggestBox_GotFocus"
LostFocus="AutoSuggestBox_LostFocus"
SuggestionChosen="AutoSuggestBox_SuggestionChosen"
Text="{x:Bind SelectedFontFamily, Mode=OneWay}"
TextChanged="AutoSuggestBox_TextChanged" />
<Button
Click="Button_Click"
Content="{ui:FontIcon FontFamily={StaticResource IconFontFamily},
FontSize=12,
Glyph=&#xE72C;}"
Style="{StaticResource GhostButtonStyle}" />
</StackPanel>
</Grid>
</UserControl>

View File

@@ -0,0 +1,95 @@
using BetterLyrics.WinUI3.Helper;
using BetterLyrics.WinUI3.Models.Settings;
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 System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.IO;
using System.Linq;
using System.Runtime.InteropServices.WindowsRuntime;
using Windows.Foundation;
using Windows.Foundation.Collections;
// 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 FontFamilyAutoSuggestBox : UserControl
{
private List<string> SystemFontNames { get; set; } = [.. FontHelper.SystemFontFamilies];
public FontFamilyAutoSuggestBox()
{
InitializeComponent();
}
public static readonly DependencyProperty SelectedFontFamilyProperty =
DependencyProperty.Register(nameof(SelectedFontFamily), typeof(string), typeof(FontFamilyAutoSuggestBox), new PropertyMetadata(default));
public string SelectedFontFamily
{
get => (string)GetValue(SelectedFontFamilyProperty);
set => SetValue(SelectedFontFamilyProperty, value);
}
private void AutoSuggestBox_SuggestionChosen(AutoSuggestBox sender, AutoSuggestBoxSuggestionChosenEventArgs args)
{
SelectedFontFamily = args.SelectedItem.ToString() ?? "";
}
private void UpdateAutoSuggestBoxItemsSource()
{
var suitableItems = new List<string>();
var splitText = AutoSuggestBox.Text.ToLower().Split(" ");
foreach (var fontFamily in SystemFontNames)
{
var found = splitText.All((key) =>
{
return fontFamily.ToLower().Contains(key);
});
if (found)
{
suitableItems.Add(fontFamily);
}
}
if (suitableItems.Count == 0)
{
suitableItems.Add("N/A");
}
AutoSuggestBox.ItemsSource = suitableItems.Order();
}
private void AutoSuggestBox_TextChanged(AutoSuggestBox sender, AutoSuggestBoxTextChangedEventArgs args)
{
// Since selecting an item will also change the text,
// only listen to changes caused by user entering text.
if (args.Reason == AutoSuggestionBoxTextChangeReason.UserInput)
{
UpdateAutoSuggestBoxItemsSource();
}
}
private void Button_Click(object sender, RoutedEventArgs e)
{
SystemFontNames = [.. FontHelper.SystemFontFamilies];
}
private void AutoSuggestBox_GotFocus(object sender, RoutedEventArgs e)
{
UpdateAutoSuggestBoxItemsSource();
}
private void AutoSuggestBox_LostFocus(object sender, RoutedEventArgs e)
{
AutoSuggestBox.Text = SelectedFontFamily;
}
}
}

View File

@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="utf-8" ?> <?xml version="1.0" encoding="utf-8" ?>
<UserControl <UserControl
x:Class="BetterLyrics.WinUI3.Controls.LyricsSettingsControl" x:Class="BetterLyrics.WinUI3.Controls.LyricsEffectSettingsControl"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:controls="using:CommunityToolkit.WinUI.Controls" xmlns:controls="using:CommunityToolkit.WinUI.Controls"
@@ -16,203 +16,6 @@
<Grid Style="{StaticResource SettingsGridStyle}"> <Grid Style="{StaticResource SettingsGridStyle}">
<StackPanel Spacing="{StaticResource SettingsCardSpacing}"> <StackPanel Spacing="{StaticResource SettingsCardSpacing}">
<!-- Lyrics style -->
<TextBlock x:Uid="SettingsPageLyricsStyle" Style="{StaticResource SettingsSectionHeaderTextBlockStyle}" />
<controls:SettingsCard x:Uid="SettingsPageLyricsAlignment" HeaderIcon="{ui:FontIcon FontFamily={StaticResource IconFontFamily}, Glyph=&#xE8E3;}">
<ComboBox SelectedIndex="{x:Bind LyricsStyleSettings.LyricsAlignmentType, Mode=TwoWay, Converter={StaticResource EnumToIntConverter}}">
<ComboBoxItem x:Uid="SettingsPageLyricsLeft" />
<ComboBoxItem x:Uid="SettingsPageLyricsCenter" />
<ComboBoxItem x:Uid="SettingsPageLyricsRight" />
</ComboBox>
</controls:SettingsCard>
<controls:SettingsCard x:Uid="SettingsPageLyricsFontFamily" HeaderIcon="{ui:FontIcon FontFamily={StaticResource IconFontFamily}, Glyph=&#xE8D2;}">
<ComboBox ItemsSource="{x:Bind SystemFontNames, Mode=OneWay}" SelectedItem="{x:Bind LyricsStyleSettings.LyricsFontFamily, Mode=TwoWay}">
<ComboBox.ItemTemplate>
<DataTemplate>
<TextBlock Text="{Binding}" />
</DataTemplate>
</ComboBox.ItemTemplate>
</ComboBox>
</controls:SettingsCard>
<controls:SettingsCard x:Uid="SettingsPageLyricsFontWeight" HeaderIcon="{ui:FontIcon FontFamily={StaticResource IconFontFamily}, Glyph=&#xE8DD;}">
<ComboBox SelectedIndex="{x:Bind LyricsStyleSettings.LyricsFontWeight, Mode=TwoWay, Converter={StaticResource EnumToIntConverter}}">
<ComboBoxItem x:Uid="SettingsPageLyricsThin" />
<ComboBoxItem x:Uid="SettingsPageLyricsExtraLight" />
<ComboBoxItem x:Uid="SettingsPageLyricsLight" />
<ComboBoxItem x:Uid="SettingsPageLyricsSemiLight" />
<ComboBoxItem x:Uid="SettingsPageLyricsNormal" />
<ComboBoxItem x:Uid="SettingsPageLyricsMedium" />
<ComboBoxItem x:Uid="SettingsPageLyricsSemiBold" />
<ComboBoxItem x:Uid="SettingsPageLyricsBold" />
<ComboBoxItem x:Uid="SettingsPageLyricsExtraBold" />
<ComboBoxItem x:Uid="SettingsPageLyricsBlack" />
<ComboBoxItem x:Uid="SettingsPageLyricsExtraBlack" />
</ComboBox>
</controls:SettingsCard>
<controls:SettingsCard x:Uid="SettingsPageLyricsBgFontOpacity" HeaderIcon="{ui:FontIcon FontFamily={StaticResource IconFontFamily}, Glyph=&#xEB42;}">
<local:ExtendedSlider
Default="30"
Frequency="1"
Maximum="100"
Minimum="0"
Unit="%"
Value="{x:Bind LyricsStyleSettings.LyricsBgFontOpacity, Mode=TwoWay}" />
</controls:SettingsCard>
<controls:SettingsCard x:Uid="SettingsPageLyricsFontStrokeWidth" HeaderIcon="{ui:FontIcon FontFamily={StaticResource IconFontFamily}, Glyph=&#xEC12;}">
<local:ExtendedSlider
Default="0"
Frequency="1"
Maximum="5"
Minimum="0"
Value="{x:Bind LyricsStyleSettings.LyricsFontStrokeWidth, Mode=TwoWay}" />
</controls:SettingsCard>
<controls:SettingsCard x:Uid="SettingsPageLyricsStrokeFontColor" HeaderIcon="{ui:FontIcon FontFamily={StaticResource IconFontFamily}, Glyph=&#xE8D3;}">
<ComboBox SelectedIndex="{x:Bind LyricsStyleSettings.LyricsStrokeFontColorType, Mode=TwoWay, Converter={StaticResource EnumToIntConverter}}">
<ComboBoxItem x:Uid="SettingsPageLyricsFontColorAdaptiveColored" />
<ComboBoxItem x:Uid="SettingsPageLyricsFontColorAdaptiveGrayed" />
<ComboBoxItem x:Uid="SettingsPageLyricsFontColorCustom" />
</ComboBox>
</controls:SettingsCard>
<ColorPicker
ColorSpectrumShape="Box"
IsAlphaEnabled="True"
IsAlphaSliderVisible="True"
IsAlphaTextInputVisible="True"
IsColorChannelTextInputVisible="True"
IsColorSliderVisible="True"
IsHexInputVisible="True"
IsMoreButtonVisible="True"
Color="{x:Bind LyricsStyleSettings.LyricsCustomStrokeFontColor, Mode=TwoWay}">
<interactivity:Interaction.Behaviors>
<interactivity:DataTriggerBehavior
Binding="{x:Bind LyricsStyleSettings.LyricsStrokeFontColorType, Mode=OneWay, Converter={StaticResource EnumToIntConverter}}"
ComparisonCondition="Equal"
Value="2">
<interactivity:ChangePropertyAction PropertyName="Visibility" Value="Visible" />
</interactivity:DataTriggerBehavior>
<interactivity:DataTriggerBehavior
Binding="{x:Bind LyricsStyleSettings.LyricsStrokeFontColorType, Mode=OneWay, Converter={StaticResource EnumToIntConverter}}"
ComparisonCondition="NotEqual"
Value="2">
<interactivity:ChangePropertyAction PropertyName="Visibility" Value="Collapsed" />
</interactivity:DataTriggerBehavior>
</interactivity:Interaction.Behaviors>
</ColorPicker>
<controls:SettingsCard x:Uid="SettingsPageLyricsBgFontColor" HeaderIcon="{ui:FontIcon FontFamily={StaticResource IconFontFamily}, Glyph=&#xE8D3;}">
<ComboBox SelectedIndex="{x:Bind LyricsStyleSettings.LyricsBgFontColorType, Mode=TwoWay, Converter={StaticResource EnumToIntConverter}}">
<ComboBoxItem x:Uid="SettingsPageLyricsFontColorAdaptiveColored" />
<ComboBoxItem x:Uid="SettingsPageLyricsFontColorAdaptiveGrayed" />
<ComboBoxItem x:Uid="SettingsPageLyricsFontColorCustom" />
</ComboBox>
</controls:SettingsCard>
<ColorPicker
ColorSpectrumShape="Box"
IsAlphaEnabled="True"
IsAlphaSliderVisible="True"
IsAlphaTextInputVisible="True"
IsColorChannelTextInputVisible="True"
IsColorSliderVisible="True"
IsHexInputVisible="True"
IsMoreButtonVisible="True"
Color="{x:Bind LyricsStyleSettings.LyricsCustomBgFontColor, Mode=TwoWay}">
<interactivity:Interaction.Behaviors>
<interactivity:DataTriggerBehavior
Binding="{x:Bind LyricsStyleSettings.LyricsBgFontColorType, Mode=OneWay, Converter={StaticResource EnumToIntConverter}}"
ComparisonCondition="Equal"
Value="2">
<interactivity:ChangePropertyAction PropertyName="Visibility" Value="Visible" />
</interactivity:DataTriggerBehavior>
<interactivity:DataTriggerBehavior
Binding="{x:Bind LyricsStyleSettings.LyricsBgFontColorType, Mode=OneWay, Converter={StaticResource EnumToIntConverter}}"
ComparisonCondition="NotEqual"
Value="2">
<interactivity:ChangePropertyAction PropertyName="Visibility" Value="Collapsed" />
</interactivity:DataTriggerBehavior>
</interactivity:Interaction.Behaviors>
</ColorPicker>
<controls:SettingsCard x:Uid="SettingsPageLyricsFgFontColor" HeaderIcon="{ui:FontIcon FontFamily={StaticResource IconFontFamily}, Glyph=&#xE8D3;}">
<ComboBox SelectedIndex="{x:Bind LyricsStyleSettings.LyricsFgFontColorType, Mode=TwoWay, Converter={StaticResource EnumToIntConverter}}">
<ComboBoxItem x:Uid="SettingsPageLyricsFontColorAdaptiveColored" />
<ComboBoxItem x:Uid="SettingsPageLyricsFontColorAdaptiveGrayed" />
<ComboBoxItem x:Uid="SettingsPageLyricsFontColorCustom" />
</ComboBox>
</controls:SettingsCard>
<ColorPicker
ColorSpectrumShape="Box"
IsAlphaEnabled="True"
IsAlphaSliderVisible="True"
IsAlphaTextInputVisible="True"
IsColorChannelTextInputVisible="True"
IsColorSliderVisible="True"
IsHexInputVisible="True"
IsMoreButtonVisible="True"
Color="{x:Bind LyricsStyleSettings.LyricsCustomFgFontColor, Mode=TwoWay}">
<interactivity:Interaction.Behaviors>
<interactivity:DataTriggerBehavior
Binding="{x:Bind LyricsStyleSettings.LyricsFgFontColorType, Mode=OneWay, Converter={StaticResource EnumToIntConverter}}"
ComparisonCondition="Equal"
Value="2">
<interactivity:ChangePropertyAction PropertyName="Visibility" Value="Visible" />
</interactivity:DataTriggerBehavior>
<interactivity:DataTriggerBehavior
Binding="{x:Bind LyricsStyleSettings.LyricsFgFontColorType, Mode=OneWay, Converter={StaticResource EnumToIntConverter}}"
ComparisonCondition="NotEqual"
Value="2">
<interactivity:ChangePropertyAction PropertyName="Visibility" Value="Collapsed" />
</interactivity:DataTriggerBehavior>
</interactivity:Interaction.Behaviors>
</ColorPicker>
<controls:SettingsExpander
x:Uid="SettingsPageLyricsFontSize"
HeaderIcon="{ui:FontIcon FontFamily={StaticResource IconFontFamily},
Glyph=&#xE8E9;}"
IsExpanded="True">
<controls:SettingsExpander.Items>
<controls:SettingsCard x:Uid="SettingsPageAutoAdjust">
<ToggleSwitch IsOn="{x:Bind LyricsStyleSettings.IsDynamicLyricsFontSize, Mode=TwoWay}" />
</controls:SettingsCard>
<controls:SettingsCard IsEnabled="{x:Bind LyricsStyleSettings.IsDynamicLyricsFontSize, Converter={StaticResource BoolNegationConverter}, Mode=OneWay}">
<local:ExtendedSlider
Frequency="2"
Maximum="96"
Minimum="12"
ResetButtonVisibility="Collapsed"
Value="{x:Bind LyricsStyleSettings.LyricsFontSize, Mode=TwoWay}" />
</controls:SettingsCard>
</controls:SettingsExpander.Items>
</controls:SettingsExpander>
<controls:SettingsCard x:Uid="SettingsPageLyricsLineSpacingFactor" HeaderIcon="{ui:FontIcon FontFamily={StaticResource IconFontFamily}, Glyph=&#xF579;}">
<local:ExtendedSlider
x:Uid="SettingsPageLyricsLineSpacingFactorSlider"
Default="0.5"
Frequency="0.1"
Maximum="2"
Minimum="0"
Unit="x"
Value="{x:Bind LyricsStyleSettings.LyricsLineSpacingFactor, Mode=TwoWay}" />
</controls:SettingsCard>
<controls:SettingsCard x:Uid="SettingsPageLyricsTranslationSeparator" HeaderIcon="{ui:FontIcon FontFamily={StaticResource IconFontFamily}, Glyph=&#xF464;}">
<StackPanel Orientation="Horizontal" Spacing="6">
<TextBox AcceptsReturn="True" Text="{x:Bind LyricsStyleSettings.LyricsTranslationSeparator, Mode=TwoWay}" />
<Button Content="{ui:FontIcon FontFamily={StaticResource IconFontFamily}, FontSize=12, Glyph=&#xE8FB;}" Style="{StaticResource GhostButtonStyle}" />
</StackPanel>
</controls:SettingsCard>
<!-- Effect --> <!-- Effect -->
<TextBlock <TextBlock
@@ -245,44 +48,48 @@
<ToggleSwitch IsOn="{x:Bind LyricsEffectSettings.IsLyricsLineFadeEnabled, Mode=TwoWay}" /> <ToggleSwitch IsOn="{x:Bind LyricsEffectSettings.IsLyricsLineFadeEnabled, Mode=TwoWay}" />
</controls:SettingsCard> </controls:SettingsCard>
<!-- 译文高亮 --> <!-- 高亮 -->
<controls:SettingsExpander <controls:SettingsExpander x:Uid="SettingsPageLyricsHighlight" HeaderIcon="{ui:FontIcon FontFamily={StaticResource IconFontFamily}, Glyph=&#xE7E6;}">
x:Uid="SettingsPageLyricsTranslationHighlight"
HeaderIcon="{ui:FontIcon FontFamily={StaticResource IconFontFamily},
Glyph=&#xE7E6;}"
IsExpanded="True">
<controls:SettingsExpander.Items> <controls:SettingsExpander.Items>
<controls:SettingsCard x:Uid="SettingsPageAmount">
<controls:SettingsCard x:Uid="SettingsPagePhoneticText">
<local:ExtendedSlider <local:ExtendedSlider
Default="60" Default="60"
Frequency="5" Frequency="5"
Maximum="100" Maximum="100"
Minimum="0" Minimum="0"
Value="{x:Bind LyricsEffectSettings.LyricsTranslationHighlightAmount, Mode=TwoWay}" /> Unit="%"
Value="{x:Bind LyricsEffectSettings.PhoneticLyricsHighlightAmount, Mode=TwoWay}" />
</controls:SettingsCard> </controls:SettingsCard>
</controls:SettingsExpander.Items>
</controls:SettingsExpander>
<!-- 原文高亮 --> <controls:SettingsCard x:Uid="SettingsPageLyricsHighlightScope">
<controls:SettingsExpander <ComboBox SelectedIndex="{x:Bind LyricsEffectSettings.OriginalLyricsHighlightScope, Mode=TwoWay, Converter={StaticResource EnumToIntConverter}}">
x:Uid="SettingsPageLyricsHighlightScope" <ComboBoxItem x:Uid="SettingsPageLyricsRendingScopeCurrentChar" />
HeaderIcon="{ui:FontIcon FontFamily={StaticResource IconFontFamily}, <ComboBoxItem x:Uid="SettingsPageLyricsRendingScopeLineStartToCurrentChar" />
Glyph=&#xE7E6;}" <ComboBoxItem x:Uid="SettingsPageLyricsRendingScopeCurrentLine" />
IsExpanded="True"> </ComboBox>
<ComboBox SelectedIndex="{x:Bind LyricsEffectSettings.LyricsHighlightScope, Mode=TwoWay, Converter={StaticResource EnumToIntConverter}}"> </controls:SettingsCard>
<ComboBoxItem x:Uid="SettingsPageLyricsRendingScopeCurrentChar" />
<ComboBoxItem x:Uid="SettingsPageLyricsRendingScopeLineStartToCurrentChar" /> <controls:SettingsCard x:Uid="SettingsPageOriginalText">
<ComboBoxItem x:Uid="SettingsPageLyricsRendingScopeCurrentLine" />
</ComboBox>
<controls:SettingsExpander.Items>
<controls:SettingsCard x:Uid="SettingsPageAmount">
<local:ExtendedSlider <local:ExtendedSlider
Default="100" Default="60"
Frequency="5" Frequency="5"
Maximum="100" Maximum="100"
Minimum="0" Minimum="0"
Value="{x:Bind LyricsEffectSettings.LyricsHighlightAmount, Mode=TwoWay}" /> Unit="%"
Value="{x:Bind LyricsEffectSettings.OriginalLyricsHighlightAmount, Mode=TwoWay}" />
</controls:SettingsCard> </controls:SettingsCard>
<controls:SettingsCard x:Uid="SettingsPageTranslatedText">
<local:ExtendedSlider
Default="60"
Frequency="5"
Maximum="100"
Minimum="0"
Unit="%"
Value="{x:Bind LyricsEffectSettings.TranslatedLyricsHighlightAmount, Mode=TwoWay}" />
</controls:SettingsCard>
</controls:SettingsExpander.Items> </controls:SettingsExpander.Items>
</controls:SettingsExpander> </controls:SettingsExpander>
@@ -426,11 +233,7 @@
</controls:SettingsExpander> </controls:SettingsExpander>
<!-- 滚动动画 --> <!-- 滚动动画 -->
<controls:SettingsExpander <controls:SettingsExpander x:Uid="SettingsPageScrollEasing" HeaderIcon="{ui:FontIcon FontFamily={StaticResource IconFontFamily}, Glyph=&#xECE7;}">
x:Uid="SettingsPageScrollEasing"
HeaderIcon="{ui:FontIcon FontFamily={StaticResource IconFontFamily},
Glyph=&#xECE7;}"
IsExpanded="True">
<ComboBox SelectedIndex="{x:Bind LyricsEffectSettings.LyricsScrollEasingType, Mode=TwoWay, Converter={StaticResource EnumToIntConverter}}"> <ComboBox SelectedIndex="{x:Bind LyricsEffectSettings.LyricsScrollEasingType, Mode=TwoWay, Converter={StaticResource EnumToIntConverter}}">
<ComboBoxItem x:Uid="SettingsPageEasingTypeLinear" /> <ComboBoxItem x:Uid="SettingsPageEasingTypeLinear" />
<ComboBoxItem x:Uid="SettingsPageEasingTypeSmoothStep" /> <ComboBoxItem x:Uid="SettingsPageEasingTypeSmoothStep" />

View File

@@ -21,27 +21,15 @@ using Windows.Foundation.Collections;
namespace BetterLyrics.WinUI3.Controls namespace BetterLyrics.WinUI3.Controls
{ {
public sealed partial class LyricsSettingsControl : UserControl public sealed partial class LyricsEffectSettingsControl : UserControl
{ {
public ObservableCollection<string> SystemFontNames { get; set; } = [.. FontHelper.SystemFontFamilies]; public LyricsEffectSettingsControl()
public LyricsSettingsControl()
{ {
InitializeComponent(); InitializeComponent();
} }
public static readonly DependencyProperty LyricsStyleSettingsProperty =
DependencyProperty.Register(nameof(LyricsStyleSettings), typeof(LyricsStyleSettings), typeof(LyricsSettingsControl), new PropertyMetadata(default));
public LyricsStyleSettings LyricsStyleSettings
{
get => (LyricsStyleSettings)GetValue(LyricsStyleSettingsProperty);
set => SetValue(LyricsStyleSettingsProperty, value);
}
public static readonly DependencyProperty LyricsEffectSettingsProperty = public static readonly DependencyProperty LyricsEffectSettingsProperty =
DependencyProperty.Register(nameof(LyricsEffectSettings), typeof(LyricsEffectSettings), typeof(LyricsSettingsControl), new PropertyMetadata(default)); DependencyProperty.Register(nameof(LyricsEffectSettings), typeof(LyricsEffectSettings), typeof(LyricsEffectSettingsControl), new PropertyMetadata(default));
public LyricsEffectSettings LyricsEffectSettings public LyricsEffectSettings LyricsEffectSettings
{ {

View File

@@ -0,0 +1,241 @@
<?xml version="1.0" encoding="utf-8" ?>
<UserControl
x:Class="BetterLyrics.WinUI3.Controls.LyricsStyleSettingsControl"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:controls="using:CommunityToolkit.WinUI.Controls"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:interactivity="using:Microsoft.Xaml.Interactivity"
xmlns:local="using:BetterLyrics.WinUI3.Controls"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:ui="using:CommunityToolkit.WinUI"
mc:Ignorable="d">
<Grid>
<ScrollViewer Style="{StaticResource SettingsScrollViewerStyle}">
<Grid Style="{StaticResource SettingsGridStyle}">
<StackPanel Spacing="{StaticResource SettingsCardSpacing}">
<!-- Lyrics style -->
<TextBlock x:Uid="SettingsPageLyricsStyle" Style="{StaticResource SettingsSectionHeaderTextBlockStyle}" />
<controls:SettingsCard x:Uid="SettingsPageLyricsAlignment" HeaderIcon="{ui:FontIcon FontFamily={StaticResource IconFontFamily}, Glyph=&#xE8E3;}">
<ComboBox SelectedIndex="{x:Bind LyricsStyleSettings.LyricsAlignmentType, Mode=TwoWay, Converter={StaticResource EnumToIntConverter}}">
<ComboBoxItem x:Uid="SettingsPageLyricsLeft" />
<ComboBoxItem x:Uid="SettingsPageLyricsCenter" />
<ComboBoxItem x:Uid="SettingsPageLyricsRight" />
</ComboBox>
</controls:SettingsCard>
<controls:SettingsExpander x:Uid="SettingsPageLyricsFontFamily" HeaderIcon="{ui:FontIcon FontFamily={StaticResource IconFontFamily}, Glyph=&#xE8D2;}">
<controls:SettingsExpander.Items>
<controls:SettingsCard x:Uid="SettingsPageCJK">
<local:FontFamilyAutoSuggestBox SelectedFontFamily="{x:Bind LyricsStyleSettings.LyricsCJKFontFamily, Mode=TwoWay}" />
</controls:SettingsCard>
<controls:SettingsCard x:Uid="SettingsPageWesternChar">
<local:FontFamilyAutoSuggestBox SelectedFontFamily="{x:Bind LyricsStyleSettings.LyricsWesternFontFamily, Mode=TwoWay}" />
</controls:SettingsCard>
</controls:SettingsExpander.Items>
</controls:SettingsExpander>
<controls:SettingsCard x:Uid="SettingsPageLyricsFontWeight" HeaderIcon="{ui:FontIcon FontFamily={StaticResource IconFontFamily}, Glyph=&#xE8DD;}">
<ComboBox SelectedIndex="{x:Bind LyricsStyleSettings.LyricsFontWeight, Mode=TwoWay, Converter={StaticResource EnumToIntConverter}}">
<ComboBoxItem x:Uid="SettingsPageLyricsThin" />
<ComboBoxItem x:Uid="SettingsPageLyricsExtraLight" />
<ComboBoxItem x:Uid="SettingsPageLyricsLight" />
<ComboBoxItem x:Uid="SettingsPageLyricsSemiLight" />
<ComboBoxItem x:Uid="SettingsPageLyricsNormal" />
<ComboBoxItem x:Uid="SettingsPageLyricsMedium" />
<ComboBoxItem x:Uid="SettingsPageLyricsSemiBold" />
<ComboBoxItem x:Uid="SettingsPageLyricsBold" />
<ComboBoxItem x:Uid="SettingsPageLyricsExtraBold" />
<ComboBoxItem x:Uid="SettingsPageLyricsBlack" />
<ComboBoxItem x:Uid="SettingsPageLyricsExtraBlack" />
</ComboBox>
</controls:SettingsCard>
<controls:SettingsCard x:Uid="SettingsPageLyricsBgFontOpacity" HeaderIcon="{ui:FontIcon FontFamily={StaticResource IconFontFamily}, Glyph=&#xEB42;}">
<local:ExtendedSlider
Default="30"
Frequency="1"
Maximum="100"
Minimum="0"
Unit="%"
Value="{x:Bind LyricsStyleSettings.LyricsBgFontOpacity, Mode=TwoWay}" />
</controls:SettingsCard>
<controls:SettingsCard x:Uid="SettingsPageLyricsFontStrokeWidth" HeaderIcon="{ui:FontIcon FontFamily={StaticResource IconFontFamily}, Glyph=&#xEC12;}">
<local:ExtendedSlider
Default="0"
Frequency="1"
Maximum="5"
Minimum="0"
Value="{x:Bind LyricsStyleSettings.LyricsFontStrokeWidth, Mode=TwoWay}" />
</controls:SettingsCard>
<!-- 字体颜色 -->
<controls:SettingsExpander x:Uid="SettingsPageFontColor" HeaderIcon="{ui:FontIcon FontFamily={StaticResource IconFontFamily}, Glyph=&#xE8D3;}">
<controls:SettingsExpander.Items>
<controls:SettingsCard x:Uid="SettingsPageStrokeFontColor">
<ComboBox SelectedIndex="{x:Bind LyricsStyleSettings.LyricsStrokeFontColorType, Mode=TwoWay, Converter={StaticResource EnumToIntConverter}}">
<ComboBoxItem x:Uid="SettingsPageLyricsFontColorAdaptiveColored" />
<ComboBoxItem x:Uid="SettingsPageLyricsFontColorAdaptiveGrayed" />
<ComboBoxItem x:Uid="SettingsPageLyricsFontColorCustom" />
</ComboBox>
</controls:SettingsCard>
<controls:SettingsCard HorizontalContentAlignment="Left">
<interactivity:Interaction.Behaviors>
<interactivity:DataTriggerBehavior
Binding="{x:Bind LyricsStyleSettings.LyricsStrokeFontColorType, Mode=OneWay, Converter={StaticResource EnumToIntConverter}}"
ComparisonCondition="Equal"
Value="2">
<interactivity:ChangePropertyAction PropertyName="Visibility" Value="Visible" />
</interactivity:DataTriggerBehavior>
<interactivity:DataTriggerBehavior
Binding="{x:Bind LyricsStyleSettings.LyricsStrokeFontColorType, Mode=OneWay, Converter={StaticResource EnumToIntConverter}}"
ComparisonCondition="NotEqual"
Value="2">
<interactivity:ChangePropertyAction PropertyName="Visibility" Value="Collapsed" />
</interactivity:DataTriggerBehavior>
</interactivity:Interaction.Behaviors>
<ColorPicker
ColorSpectrumShape="Box"
IsAlphaEnabled="True"
IsAlphaSliderVisible="True"
IsAlphaTextInputVisible="True"
IsColorChannelTextInputVisible="True"
IsColorSliderVisible="True"
IsHexInputVisible="True"
IsMoreButtonVisible="True"
Color="{x:Bind LyricsStyleSettings.LyricsCustomStrokeFontColor, Mode=TwoWay}" />
</controls:SettingsCard>
<controls:SettingsCard x:Uid="SettingsPageLyricsBgFontColor">
<ComboBox SelectedIndex="{x:Bind LyricsStyleSettings.LyricsBgFontColorType, Mode=TwoWay, Converter={StaticResource EnumToIntConverter}}">
<ComboBoxItem x:Uid="SettingsPageLyricsFontColorAdaptiveColored" />
<ComboBoxItem x:Uid="SettingsPageLyricsFontColorAdaptiveGrayed" />
<ComboBoxItem x:Uid="SettingsPageLyricsFontColorCustom" />
</ComboBox>
</controls:SettingsCard>
<controls:SettingsCard>
<interactivity:Interaction.Behaviors>
<interactivity:DataTriggerBehavior
Binding="{x:Bind LyricsStyleSettings.LyricsBgFontColorType, Mode=OneWay, Converter={StaticResource EnumToIntConverter}}"
ComparisonCondition="Equal"
Value="2">
<interactivity:ChangePropertyAction PropertyName="Visibility" Value="Visible" />
</interactivity:DataTriggerBehavior>
<interactivity:DataTriggerBehavior
Binding="{x:Bind LyricsStyleSettings.LyricsBgFontColorType, Mode=OneWay, Converter={StaticResource EnumToIntConverter}}"
ComparisonCondition="NotEqual"
Value="2">
<interactivity:ChangePropertyAction PropertyName="Visibility" Value="Collapsed" />
</interactivity:DataTriggerBehavior>
</interactivity:Interaction.Behaviors>
<ColorPicker
ColorSpectrumShape="Box"
IsAlphaEnabled="True"
IsAlphaSliderVisible="True"
IsAlphaTextInputVisible="True"
IsColorChannelTextInputVisible="True"
IsColorSliderVisible="True"
IsHexInputVisible="True"
IsMoreButtonVisible="True"
Color="{x:Bind LyricsStyleSettings.LyricsCustomBgFontColor, Mode=TwoWay}" />
</controls:SettingsCard>
<controls:SettingsCard x:Uid="SettingsPageLyricsFgFontColor">
<ComboBox SelectedIndex="{x:Bind LyricsStyleSettings.LyricsFgFontColorType, Mode=TwoWay, Converter={StaticResource EnumToIntConverter}}">
<ComboBoxItem x:Uid="SettingsPageLyricsFontColorAdaptiveColored" />
<ComboBoxItem x:Uid="SettingsPageLyricsFontColorAdaptiveGrayed" />
<ComboBoxItem x:Uid="SettingsPageLyricsFontColorCustom" />
</ComboBox>
</controls:SettingsCard>
<controls:SettingsCard>
<interactivity:Interaction.Behaviors>
<interactivity:DataTriggerBehavior
Binding="{x:Bind LyricsStyleSettings.LyricsFgFontColorType, Mode=OneWay, Converter={StaticResource EnumToIntConverter}}"
ComparisonCondition="Equal"
Value="2">
<interactivity:ChangePropertyAction PropertyName="Visibility" Value="Visible" />
</interactivity:DataTriggerBehavior>
<interactivity:DataTriggerBehavior
Binding="{x:Bind LyricsStyleSettings.LyricsFgFontColorType, Mode=OneWay, Converter={StaticResource EnumToIntConverter}}"
ComparisonCondition="NotEqual"
Value="2">
<interactivity:ChangePropertyAction PropertyName="Visibility" Value="Collapsed" />
</interactivity:DataTriggerBehavior>
</interactivity:Interaction.Behaviors>
<ColorPicker
ColorSpectrumShape="Box"
IsAlphaEnabled="True"
IsAlphaSliderVisible="True"
IsAlphaTextInputVisible="True"
IsColorChannelTextInputVisible="True"
IsColorSliderVisible="True"
IsHexInputVisible="True"
IsMoreButtonVisible="True"
Color="{x:Bind LyricsStyleSettings.LyricsCustomFgFontColor, Mode=TwoWay}" />
</controls:SettingsCard>
</controls:SettingsExpander.Items>
</controls:SettingsExpander>
<controls:SettingsExpander x:Uid="SettingsPageLyricsFontSize" HeaderIcon="{ui:FontIcon FontFamily={StaticResource IconFontFamily}, Glyph=&#xE8E9;}">
<controls:SettingsExpander.Items>
<controls:SettingsCard x:Uid="SettingsPageAutoAdjust">
<ToggleSwitch IsOn="{x:Bind LyricsStyleSettings.IsDynamicLyricsFontSize, Mode=TwoWay}" />
</controls:SettingsCard>
<controls:SettingsCard x:Uid="SettingsPagePhoneticText" IsEnabled="{x:Bind LyricsStyleSettings.IsDynamicLyricsFontSize, Converter={StaticResource BoolNegationConverter}, Mode=OneWay}">
<local:ExtendedSlider
Frequency="2"
Maximum="96"
Minimum="12"
ResetButtonVisibility="Collapsed"
Value="{x:Bind LyricsStyleSettings.PhoneticLyricsFontSize, Mode=TwoWay}" />
</controls:SettingsCard>
<controls:SettingsCard x:Uid="SettingsPageOriginalText" IsEnabled="{x:Bind LyricsStyleSettings.IsDynamicLyricsFontSize, Converter={StaticResource BoolNegationConverter}, Mode=OneWay}">
<local:ExtendedSlider
Frequency="2"
Maximum="96"
Minimum="12"
ResetButtonVisibility="Collapsed"
Value="{x:Bind LyricsStyleSettings.OriginalLyricsFontSize, Mode=TwoWay}" />
</controls:SettingsCard>
<controls:SettingsCard x:Uid="SettingsPageTranslatedText" IsEnabled="{x:Bind LyricsStyleSettings.IsDynamicLyricsFontSize, Converter={StaticResource BoolNegationConverter}, Mode=OneWay}">
<local:ExtendedSlider
Frequency="2"
Maximum="96"
Minimum="12"
ResetButtonVisibility="Collapsed"
Value="{x:Bind LyricsStyleSettings.TranslatedLyricsFontSize, Mode=TwoWay}" />
</controls:SettingsCard>
</controls:SettingsExpander.Items>
</controls:SettingsExpander>
<controls:SettingsCard x:Uid="SettingsPageLyricsLineSpacingFactor" HeaderIcon="{ui:FontIcon FontFamily={StaticResource IconFontFamily}, Glyph=&#xF579;}">
<local:ExtendedSlider
x:Uid="SettingsPageLyricsLineSpacingFactorSlider"
Default="0.5"
Frequency="0.1"
Maximum="2"
Minimum="0"
Unit="x"
Value="{x:Bind LyricsStyleSettings.LyricsLineSpacingFactor, Mode=TwoWay}" />
</controls:SettingsCard>
<controls:SettingsCard x:Uid="SettingsPageLyricsTranslationSeparator" HeaderIcon="{ui:FontIcon FontFamily={StaticResource IconFontFamily}, Glyph=&#xF464;}">
<StackPanel Orientation="Horizontal" Spacing="6">
<TextBox AcceptsReturn="True" Text="{x:Bind LyricsStyleSettings.LyricsTranslationSeparator, Mode=TwoWay}" />
<Button Content="{ui:FontIcon FontFamily={StaticResource IconFontFamily}, FontSize=12, Glyph=&#xE8FB;}" Style="{StaticResource GhostButtonStyle}" />
</StackPanel>
</controls:SettingsCard>
</StackPanel>
</Grid>
</ScrollViewer>
</Grid>
</UserControl>

View File

@@ -0,0 +1,40 @@
using BetterLyrics.WinUI3.Helper;
using BetterLyrics.WinUI3.Models.Settings;
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 System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.IO;
using System.Linq;
using System.Runtime.InteropServices.WindowsRuntime;
using Windows.Foundation;
using Windows.Foundation.Collections;
// 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 LyricsStyleSettingsControl : UserControl
{
public LyricsStyleSettingsControl()
{
InitializeComponent();
}
public static readonly DependencyProperty LyricsStyleSettingsProperty =
DependencyProperty.Register(nameof(LyricsStyleSettings), typeof(LyricsStyleSettings), typeof(LyricsStyleSettingsControl), new PropertyMetadata(default));
public LyricsStyleSettings LyricsStyleSettings
{
get => (LyricsStyleSettings)GetValue(LyricsStyleSettingsProperty);
set => SetValue(LyricsStyleSettingsProperty, value);
}
}
}

View File

@@ -268,9 +268,14 @@
<uc:AlbumArtLayoutSettingsControl AlbumArtLayoutSettings="{x:Bind ViewModel.LiveStates.LyricsWindowStatus.AlbumArtLayoutSettings, Mode=OneWay}" /> <uc:AlbumArtLayoutSettingsControl AlbumArtLayoutSettings="{x:Bind ViewModel.LiveStates.LyricsWindowStatus.AlbumArtLayoutSettings, Mode=OneWay}" />
</controls:Case> </controls:Case>
<!-- Lyrics style and effect --> <!-- Lyrics style -->
<controls:Case Value="Lyrics"> <controls:Case Value="LyricsStyle">
<uc:LyricsSettingsControl LyricsEffectSettings="{x:Bind ViewModel.LiveStates.LyricsWindowStatus.LyricsEffectSettings, Mode=OneWay}" LyricsStyleSettings="{x:Bind ViewModel.LiveStates.LyricsWindowStatus.LyricsStyleSettings, Mode=OneWay}" /> <uc:LyricsStyleSettingsControl LyricsStyleSettings="{x:Bind ViewModel.LiveStates.LyricsWindowStatus.LyricsStyleSettings, Mode=OneWay}" />
</controls:Case>
<!-- Lyrics effect -->
<controls:Case Value="LyricsEffect">
<uc:LyricsEffectSettingsControl LyricsEffectSettings="{x:Bind ViewModel.LiveStates.LyricsWindowStatus.LyricsEffectSettings, Mode=OneWay}" />
</controls:Case> </controls:Case>
<!-- Lyrics background --> <!-- Lyrics background -->
@@ -349,13 +354,23 @@
</StackPanel> </StackPanel>
</ListViewItem> </ListViewItem>
<ListViewItem Tag="Lyrics"> <ListViewItem Tag="LyricsStyle">
<StackPanel Orientation="Horizontal" Spacing="6"> <StackPanel Orientation="Horizontal" Spacing="6">
<FontIcon <FontIcon
FontFamily="{StaticResource IconFontFamily}" FontFamily="{StaticResource IconFontFamily}"
FontSize="16" FontSize="16"
Glyph="&#xEDC6;" /> Glyph="&#xEDC6;" />
<TextBlock x:Uid="SettingsPageLyrics" VerticalAlignment="Center" /> <TextBlock x:Uid="SettingsPageLyricsStyle" VerticalAlignment="Center" />
</StackPanel>
</ListViewItem>
<ListViewItem Tag="LyricsEffect">
<StackPanel Orientation="Horizontal" Spacing="6">
<FontIcon
FontFamily="{StaticResource IconFontFamily}"
FontSize="16"
Glyph="&#xF4A5;" />
<TextBlock x:Uid="SettingsPageLyricsEffect" VerticalAlignment="Center" />
</StackPanel> </StackPanel>
</ListViewItem> </ListViewItem>

View File

@@ -306,10 +306,7 @@
</controls:SettingsExpander> </controls:SettingsExpander>
<!-- Lyrics phonetic --> <!-- Lyrics phonetic -->
<controls:SettingsExpander <controls:SettingsExpander x:Uid="SettingsPageChinese" IsExpanded="True">
x:Uid="SettingsPageChinese"
IsEnabled="{x:Bind ViewModel.AppSettings.TranslationSettings.IsTranslationEnabled, Mode=OneWay}"
IsExpanded="True">
<ToggleSwitch IsOn="{x:Bind ViewModel.AppSettings.TranslationSettings.IsChineseRomanizationEnabled, Mode=TwoWay}" /> <ToggleSwitch IsOn="{x:Bind ViewModel.AppSettings.TranslationSettings.IsChineseRomanizationEnabled, Mode=TwoWay}" />
<controls:SettingsExpander.Items> <controls:SettingsExpander.Items>
<controls:SettingsCard> <controls:SettingsCard>
@@ -320,7 +317,7 @@
</controls:SettingsCard> </controls:SettingsCard>
</controls:SettingsExpander.Items> </controls:SettingsExpander.Items>
</controls:SettingsExpander> </controls:SettingsExpander>
<controls:SettingsCard x:Uid="SettingsPageJapanese" IsEnabled="{x:Bind ViewModel.AppSettings.TranslationSettings.IsTranslationEnabled, Mode=OneWay}"> <controls:SettingsCard x:Uid="SettingsPageJapanese">
<ToggleSwitch IsOn="{x:Bind ViewModel.AppSettings.TranslationSettings.IsJapaneseRomanizationEnabled, Mode=TwoWay}" /> <ToggleSwitch IsOn="{x:Bind ViewModel.AppSettings.TranslationSettings.IsJapaneseRomanizationEnabled, Mode=TwoWay}" />
</controls:SettingsCard> </controls:SettingsCard>

View File

@@ -3,6 +3,7 @@ using BetterLyrics.WinUI3.Models;
using Microsoft.Graphics.Canvas; using Microsoft.Graphics.Canvas;
using Microsoft.Graphics.Canvas.Brushes; using Microsoft.Graphics.Canvas.Brushes;
using Microsoft.Graphics.Canvas.Effects; using Microsoft.Graphics.Canvas.Effects;
using Microsoft.Graphics.Canvas.Geometry;
using Microsoft.Graphics.Canvas.Text; using Microsoft.Graphics.Canvas.Text;
using Microsoft.Graphics.Canvas.UI.Xaml; using Microsoft.Graphics.Canvas.UI.Xaml;
using Microsoft.UI; using Microsoft.UI;
@@ -72,19 +73,38 @@ namespace BetterLyrics.WinUI3.Helper
{ {
CanvasCommandList list = new(control); CanvasCommandList list = new(control);
using var ds = list.CreateDrawingSession(); using var ds = list.CreateDrawingSession();
// 描边
if (strokeWidth > 0) if (strokeWidth > 0)
{ {
if (lyricsLine.TextGeometry == null) if (lyricsLine.PhoneticCanvasGeometry != null)
{ {
return list; ds.DrawGeometry(lyricsLine.PhoneticCanvasGeometry, lyricsLine.PhoneticPosition, strokeColor, strokeWidth);
}
if (lyricsLine.OriginalCanvasGeometry != null)
{
ds.DrawGeometry(lyricsLine.OriginalCanvasGeometry, lyricsLine.OriginalPosition, strokeColor, strokeWidth);
}
if (lyricsLine.TranslatedCanvasGeometry != null)
{
ds.DrawGeometry(lyricsLine.TranslatedCanvasGeometry, lyricsLine.TranslatedPosition, strokeColor, strokeWidth);
} }
ds.DrawGeometry(lyricsLine.TextGeometry, lyricsLine.Position, strokeColor, strokeWidth); // 描边
} }
if (lyricsLine.CanvasTextLayout == null)
// 绘制文本(填充)
if (lyricsLine.PhoneticCanvasTextLayout != null)
{ {
return list; ds.DrawTextLayout(lyricsLine.PhoneticCanvasTextLayout, lyricsLine.PhoneticPosition, fontColor);
} }
ds.DrawTextLayout(lyricsLine.CanvasTextLayout, lyricsLine.Position, fontColor); // 绘制文本(填充) if (lyricsLine.OriginalCanvasTextLayout != null)
{
ds.DrawTextLayout(lyricsLine.OriginalCanvasTextLayout, lyricsLine.OriginalPosition, fontColor);
}
if (lyricsLine.TranslatedCanvasTextLayout != null)
{
ds.DrawTextLayout(lyricsLine.TranslatedCanvasTextLayout, lyricsLine.TranslatedPosition, fontColor);
}
return list; return list;
} }
@@ -113,12 +133,12 @@ namespace BetterLyrics.WinUI3.Helper
var mask = new CanvasCommandList(control); var mask = new CanvasCommandList(control);
using var ds = mask.CreateDrawingSession(); using var ds = mask.CreateDrawingSession();
if (lyricsLine.CanvasTextLayout == null) if (lyricsLine.OriginalCanvasTextLayout == null)
{ {
return mask; return mask;
} }
var highlightRegion = lyricsLine.CanvasTextLayout.GetCharacterRegions(charStartIndex, charLength).FirstOrDefault(); var highlightRegion = lyricsLine.OriginalCanvasTextLayout.GetCharacterRegions(charStartIndex, charLength).FirstOrDefault();
double highlightTotalWidth = (double)highlightRegion.LayoutBounds.Width; double highlightTotalWidth = (double)highlightRegion.LayoutBounds.Width;
// Draw the highlight for the current character // Draw the highlight for the current character
@@ -129,20 +149,20 @@ namespace BetterLyrics.WinUI3.Helper
// Rects // Rects
var highlightRect = new Rect( var highlightRect = new Rect(
highlightRegion.LayoutBounds.X, highlightRegion.LayoutBounds.X,
highlightRegion.LayoutBounds.Y + lyricsLine.Position.Y, highlightRegion.LayoutBounds.Y + lyricsLine.OriginalPosition.Y,
highlightWidth, highlightWidth,
highlightRegion.LayoutBounds.Height highlightRegion.LayoutBounds.Height
); );
var fadeInRect = new Rect( var fadeInRect = new Rect(
highlightRect.Right - fadingWidth, highlightRect.Right - fadingWidth,
highlightRegion.LayoutBounds.Y + lyricsLine.Position.Y, highlightRegion.LayoutBounds.Y + lyricsLine.OriginalPosition.Y,
fadingWidth, fadingWidth,
highlightRegion.LayoutBounds.Height highlightRegion.LayoutBounds.Height
); );
var fadeOutRect = new Rect( var fadeOutRect = new Rect(
highlightRect.Right, highlightRect.Right,
highlightRegion.LayoutBounds.Y + lyricsLine.Position.Y, highlightRegion.LayoutBounds.Y + lyricsLine.OriginalPosition.Y,
fadingWidth, fadingWidth,
highlightRegion.LayoutBounds.Height highlightRegion.LayoutBounds.Height
); );
@@ -171,15 +191,15 @@ namespace BetterLyrics.WinUI3.Helper
{ {
var mask = new CanvasCommandList(control); var mask = new CanvasCommandList(control);
if (lyricsLine.CanvasTextLayout == null) if (lyricsLine.OriginalCanvasTextLayout == null)
{ {
return mask; return mask;
} }
using var ds = mask.CreateDrawingSession(); using var ds = mask.CreateDrawingSession();
var regions = lyricsLine.CanvasTextLayout.GetCharacterRegions(0, charStartIndex); var regions = lyricsLine.OriginalCanvasTextLayout.GetCharacterRegions(0, charStartIndex);
var highlightRegion = lyricsLine.CanvasTextLayout var highlightRegion = lyricsLine.OriginalCanvasTextLayout
.GetCharacterRegions(charStartIndex, charLength) .GetCharacterRegions(charStartIndex, charLength)
.FirstOrDefault(); .FirstOrDefault();
if (regions.Length > 0) if (regions.Length > 0)
@@ -190,7 +210,7 @@ namespace BetterLyrics.WinUI3.Helper
var region = regions[j]; var region = regions[j];
var rect = new Rect( var rect = new Rect(
region.LayoutBounds.X, region.LayoutBounds.X,
region.LayoutBounds.Y + lyricsLine.Position.Y, region.LayoutBounds.Y + lyricsLine.OriginalPosition.Y,
region.LayoutBounds.Width, region.LayoutBounds.Width,
region.LayoutBounds.Height region.LayoutBounds.Height
); );
@@ -207,14 +227,14 @@ namespace BetterLyrics.WinUI3.Helper
// Rects // Rects
var highlightRect = new Rect( var highlightRect = new Rect(
highlightRegion.LayoutBounds.X, highlightRegion.LayoutBounds.X,
highlightRegion.LayoutBounds.Y + lyricsLine.Position.Y, highlightRegion.LayoutBounds.Y + lyricsLine.OriginalPosition.Y,
highlightWidth, highlightWidth,
highlightRegion.LayoutBounds.Height highlightRegion.LayoutBounds.Height
); );
var fadeInRect = new Rect( var fadeInRect = new Rect(
highlightRect.Right - fadingWidth, highlightRect.Right - fadingWidth,
highlightRegion.LayoutBounds.Y + lyricsLine.Position.Y, highlightRegion.LayoutBounds.Y + lyricsLine.OriginalPosition.Y,
fadingWidth, fadingWidth,
highlightRegion.LayoutBounds.Height highlightRegion.LayoutBounds.Height
); );
@@ -225,7 +245,7 @@ namespace BetterLyrics.WinUI3.Helper
{ {
var fadeOutRect = new Rect( var fadeOutRect = new Rect(
highlightRect.Right, highlightRect.Right,
highlightRegion.LayoutBounds.Y + lyricsLine.Position.Y, highlightRegion.LayoutBounds.Y + lyricsLine.OriginalPosition.Y,
fadingWidth, fadingWidth,
highlightRegion.LayoutBounds.Height highlightRegion.LayoutBounds.Height
); );
@@ -246,12 +266,12 @@ namespace BetterLyrics.WinUI3.Helper
var mask = new CanvasCommandList(control); var mask = new CanvasCommandList(control);
using var ds = mask.CreateDrawingSession(); using var ds = mask.CreateDrawingSession();
if (lyricsLine.CanvasTextLayout == null) if (lyricsLine.OriginalCanvasTextLayout == null)
{ {
return mask; return mask;
} }
var regions = lyricsLine.CanvasTextLayout.GetCharacterRegions(0, lyricsLine.OriginalText.Length); var regions = lyricsLine.OriginalCanvasTextLayout.GetCharacterRegions(0, lyricsLine.OriginalText.Length);
if (regions.Length > 0) if (regions.Length > 0)
{ {
for (int j = 0; j < regions.Length; j++) for (int j = 0; j < regions.Length; j++)
@@ -259,7 +279,7 @@ namespace BetterLyrics.WinUI3.Helper
var region = regions[j]; var region = regions[j];
var rect = new Rect( var rect = new Rect(
region.LayoutBounds.X, region.LayoutBounds.X,
region.LayoutBounds.Y + lyricsLine.Position.Y, region.LayoutBounds.Y + lyricsLine.OriginalPosition.Y,
region.LayoutBounds.Width, region.LayoutBounds.Width,
region.LayoutBounds.Height region.LayoutBounds.Height
); );
@@ -270,17 +290,17 @@ namespace BetterLyrics.WinUI3.Helper
return mask; return mask;
} }
public static CanvasCommandList CreateTranslationHighlightMask(ICanvasAnimatedControl control, LyricsLine lyricsLine) public static CanvasCommandList CreatePhoneticHighlightMask(ICanvasAnimatedControl control, LyricsLine lyricsLine)
{ {
var mask = new CanvasCommandList(control); var mask = new CanvasCommandList(control);
using var ds = mask.CreateDrawingSession(); using var ds = mask.CreateDrawingSession();
if (lyricsLine.CanvasTextLayout == null) if (lyricsLine.PhoneticCanvasTextLayout == null)
{ {
return mask; return mask;
} }
var regions = lyricsLine.CanvasTextLayout.GetCharacterRegions(lyricsLine.OriginalText.Length, lyricsLine.DisplayedText.Length - lyricsLine.OriginalText.Length); var regions = lyricsLine.PhoneticCanvasTextLayout.GetCharacterRegions(0, lyricsLine.PhoneticText.Length);
if (regions.Length > 0) if (regions.Length > 0)
{ {
for (int j = 0; j < regions.Length; j++) for (int j = 0; j < regions.Length; j++)
@@ -288,7 +308,36 @@ namespace BetterLyrics.WinUI3.Helper
var region = regions[j]; var region = regions[j];
var rect = new Rect( var rect = new Rect(
region.LayoutBounds.X, region.LayoutBounds.X,
region.LayoutBounds.Y + lyricsLine.Position.Y, region.LayoutBounds.Y + lyricsLine.PhoneticPosition.Y,
region.LayoutBounds.Width,
region.LayoutBounds.Height
);
ds.FillRectangle(rect, Colors.White);
}
}
return mask;
}
public static CanvasCommandList CreateTranslatedHighlightMask(ICanvasAnimatedControl control, LyricsLine lyricsLine)
{
var mask = new CanvasCommandList(control);
using var ds = mask.CreateDrawingSession();
if (lyricsLine.TranslatedCanvasTextLayout == null)
{
return mask;
}
var regions = lyricsLine.TranslatedCanvasTextLayout.GetCharacterRegions(0, lyricsLine.TranslatedText.Length);
if (regions.Length > 0)
{
for (int j = 0; j < regions.Length; j++)
{
var region = regions[j];
var rect = new Rect(
region.LayoutBounds.X,
region.LayoutBounds.Y + lyricsLine.TranslatedPosition.Y,
region.LayoutBounds.Width, region.LayoutBounds.Width,
region.LayoutBounds.Height region.LayoutBounds.Height
); );

View File

@@ -18,6 +18,8 @@ namespace BetterLyrics.WinUI3.Helper
{ {
private List<LyricsData> _lyricsDataArr = []; private List<LyricsData> _lyricsDataArr = [];
public LyricsData? LibreTranslationLyricsData => _lyricsDataArr.LastOrDefault();
public List<LyricsData> Parse(string? raw, int? durationMs) public List<LyricsData> Parse(string? raw, int? durationMs)
{ {
durationMs ??= (int)TimeSpan.FromMinutes(99).TotalMilliseconds; durationMs ??= (int)TimeSpan.FromMinutes(99).TotalMilliseconds;
@@ -48,7 +50,7 @@ namespace BetterLyrics.WinUI3.Helper
} }
} }
FillRomanizationLyricsData(); FillRomanizationLyricsData();
_lyricsDataArr.Add(new LyricsData()); // 为机翻预留 _lyricsDataArr.Add(new LyricsData()); // 为 LibreTranslation 预留
return _lyricsDataArr; return _lyricsDataArr;
} }

View File

@@ -32,7 +32,23 @@ namespace BetterLyrics.WinUI3.Models
LyricsLines = lyricsLines; LyricsLines = lyricsLines;
} }
public void SetDisplayedTextAlongWith(LyricsData translationData, string separator, int toleranceMs = 0) public void ClearTranslatedText()
{
foreach (var line in LyricsLines)
{
line.TranslatedText = "";
}
}
public void ClearPhoneticText()
{
foreach (var line in LyricsLines)
{
line.PhoneticText = "";
}
}
public void SetTranslatedText(LyricsData translationData, string separator, int toleranceMs = 0)
{ {
foreach (var line in LyricsLines) foreach (var line in LyricsLines)
{ {
@@ -42,17 +58,39 @@ namespace BetterLyrics.WinUI3.Models
if (transLine != null) if (transLine != null)
{ {
line.DisplayedText = $"{line.OriginalText}{separator}{transLine.OriginalText}"; // 此处 transLine.OriginalText 指翻译中的“原文”属性
line.TranslatedText = transLine.OriginalText;
} }
else else
{ {
// 没有匹配的翻译,翻译部分留空 // 没有匹配的翻译
line.DisplayedText = $"{line.OriginalText}"; line.TranslatedText = "";
} }
} }
} }
public void SetDisplayedTextAlongWith(string translation, string separator) public void SetPhoneticText(LyricsData phoneticData, string separator, int toleranceMs = 0)
{
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, string separator)
{ {
List<string> translationArr = translation.Split(StringHelper.NewLine).ToList(); List<string> translationArr = translation.Split(StringHelper.NewLine).ToList();
int i = 0; int i = 0;
@@ -60,24 +98,16 @@ namespace BetterLyrics.WinUI3.Models
{ {
if (i >= translationArr.Count) if (i >= translationArr.Count)
{ {
line.DisplayedText = line.OriginalText; // No translation available, keep original text line.TranslatedText = ""; // No translation available, keep empty
} }
else else
{ {
line.DisplayedText = $"{line.OriginalText}{separator}{translationArr[i]}"; line.TranslatedText = translationArr[i];
} }
i++; i++;
} }
} }
public void SetDisplayedTextInOriginalText()
{
foreach (var line in LyricsLines)
{
line.DisplayedText = line.OriginalText;
}
}
public LyricsData CreateLyricsDataFrom(string translation) public LyricsData CreateLyricsDataFrom(string translation)
{ {
var result = new LyricsData(LyricsLines.Select(line => new LyricsLine var result = new LyricsData(LyricsLines.Select(line => new LyricsLine
@@ -120,8 +150,9 @@ namespace BetterLyrics.WinUI3.Models
{ {
StartMs = 0, StartMs = 0,
EndMs = (int)TimeSpan.FromMinutes(99).TotalMilliseconds, EndMs = (int)TimeSpan.FromMinutes(99).TotalMilliseconds,
PhoneticText = "",
OriginalText = "● ● ●", OriginalText = "● ● ●",
DisplayedText = "● ● ●", TranslatedText = "",
LyricsChars = [], LyricsChars = [],
}, },
]); ]);

View File

@@ -2,6 +2,7 @@
using BetterLyrics.WinUI3.Enums; using BetterLyrics.WinUI3.Enums;
using BetterLyrics.WinUI3.Helper; using BetterLyrics.WinUI3.Helper;
using BetterLyrics.WinUI3.Services;
using Microsoft.Graphics.Canvas; using Microsoft.Graphics.Canvas;
using Microsoft.Graphics.Canvas.Effects; using Microsoft.Graphics.Canvas.Effects;
using Microsoft.Graphics.Canvas.Geometry; using Microsoft.Graphics.Canvas.Geometry;
@@ -53,10 +54,23 @@ namespace BetterLyrics.WinUI3.Models
easingType: EasingType.EaseInOutQuad easingType: EasingType.EaseInOutQuad
); );
public CanvasTextLayout? CanvasTextLayout { get; private set; } public CanvasTextLayout? OriginalCanvasTextLayout { get; private set; }
public CanvasTextLayout? TranslatedCanvasTextLayout { get; private set; }
public CanvasTextLayout? PhoneticCanvasTextLayout { get; private set; }
public Vector2 CenterPosition { get; private set; } public Vector2 CenterPosition { get; private set; }
public Vector2 Position { get; set; } /// <summary>
/// 原文位置
/// </summary>
public Vector2 OriginalPosition { get; set; }
/// <summary>
/// 译文位置
/// </summary>
public Vector2 TranslatedPosition { get; set; }
/// <summary>
/// 注音位置
/// </summary>
public Vector2 PhoneticPosition { get; set; }
public List<LyricsChar> LyricsChars { get; set; } = []; public List<LyricsChar> LyricsChars { get; set; } = [];
@@ -64,54 +78,134 @@ namespace BetterLyrics.WinUI3.Models
public int? EndMs { get; set; } public int? EndMs { get; set; }
public int StartMs { get; set; } public int StartMs { get; set; }
public string DisplayedText { get; set; } = ""; /// <summary>
/// 原文
/// </summary>
public string OriginalText { get; set; } = ""; public string OriginalText { get; set; } = "";
/// <summary>
/// 译文
/// </summary>
public string TranslatedText { get; set; } = "";
/// <summary>
/// 注音
/// </summary>
public string PhoneticText { get; set; } = "";
public CanvasGeometry? TextGeometry { get; private set; } public CanvasGeometry? OriginalCanvasGeometry { get; private set; }
public CanvasGeometry? TranslatedCanvasGeometry { get; private set; }
public CanvasGeometry? PhoneticCanvasGeometry { get; private set; }
public void UpdateCenterPosition(double maxWidth, TextAlignmentType type) public void UpdateCenterPosition(double maxWidth, TextAlignmentType type)
{ {
if (CanvasTextLayout == null) if (OriginalCanvasTextLayout == null)
{ {
return; return;
} }
double centerY = Position.Y + (double)CanvasTextLayout.LayoutBounds.Height;
double centerY = OriginalPosition.Y + (OriginalCanvasTextLayout?.LayoutBounds.Height ?? 0) / 2;
CenterPosition = type switch CenterPosition = type switch
{ {
TextAlignmentType.Left => new Vector2(Position.X, (float)centerY), TextAlignmentType.Left => new Vector2(OriginalPosition.X, (float)centerY),
TextAlignmentType.Center => new Vector2((float)(Position.X + maxWidth / 2.0), (float)centerY), TextAlignmentType.Center => new Vector2((float)(OriginalPosition.X + maxWidth / 2.0), (float)centerY),
TextAlignmentType.Right => new Vector2((float)(Position.X + maxWidth), (float)centerY), TextAlignmentType.Right => new Vector2((float)(OriginalPosition.X + maxWidth), (float)centerY),
_ => throw new System.ArgumentOutOfRangeException(nameof(type), type, null), _ => throw new System.ArgumentOutOfRangeException(nameof(type), type, null),
}; };
} }
public void DisposeTextLayout() public void DisposeTextLayout()
{ {
CanvasTextLayout?.Dispose(); PhoneticCanvasTextLayout?.Dispose();
CanvasTextLayout = null; PhoneticCanvasTextLayout = null;
OriginalCanvasTextLayout?.Dispose();
OriginalCanvasTextLayout = null;
TranslatedCanvasTextLayout?.Dispose();
TranslatedCanvasTextLayout = null;
} }
public void RecreateTextLayout(ICanvasAnimatedControl control, CanvasTextFormat textFormat, double maxWidth, double maxHeight, TextAlignmentType type) public void RecreateTextLayout(
ICanvasAnimatedControl control,
bool createPhonetic, bool createTranslated,
int phoneticTextFontSize, int originalTextFontSize, int translatedTextFontSize,
LyricsFontWeight originalTextFontWeight,
string fontFamilyCJK, string fontFamilyWestern,
double maxWidth, double maxHeight, TextAlignmentType type)
{ {
DisposeTextLayout(); DisposeTextLayout();
CanvasTextLayout = new CanvasTextLayout(control, DisplayedText, textFormat, (float)maxWidth, (float)maxHeight);
CanvasTextLayout.HorizontalAlignment = type.ToCanvasHorizontalAlignment(); if (createPhonetic && PhoneticText != "")
{
PhoneticCanvasTextLayout = new CanvasTextLayout(control, PhoneticText, new CanvasTextFormat
{
HorizontalAlignment = CanvasHorizontalAlignment.Left,
VerticalAlignment = CanvasVerticalAlignment.Top,
FontSize = phoneticTextFontSize,
FontFamily = LanguageHelper.IsCJK(PhoneticText) ? fontFamilyCJK : fontFamilyWestern,
}, (float)maxWidth, (float)maxHeight)
{
HorizontalAlignment = type.ToCanvasHorizontalAlignment(),
};
}
OriginalCanvasTextLayout = new CanvasTextLayout(control, OriginalText, new CanvasTextFormat
{
HorizontalAlignment = CanvasHorizontalAlignment.Left,
VerticalAlignment = CanvasVerticalAlignment.Top,
FontSize = originalTextFontSize,
FontWeight = originalTextFontWeight.ToFontWeight(),
FontFamily = LanguageHelper.IsCJK(OriginalText) ? fontFamilyCJK : fontFamilyWestern,
}, (float)maxWidth, (float)maxHeight)
{
HorizontalAlignment = type.ToCanvasHorizontalAlignment()
};
if (createTranslated && TranslatedText != "")
{
TranslatedCanvasTextLayout = new CanvasTextLayout(control, TranslatedText, new CanvasTextFormat
{
HorizontalAlignment = CanvasHorizontalAlignment.Left,
VerticalAlignment = CanvasVerticalAlignment.Top,
FontSize = translatedTextFontSize,
FontFamily = LanguageHelper.IsCJK(TranslatedText) ? fontFamilyCJK : fontFamilyWestern,
}, (float)maxWidth, (float)maxHeight)
{
HorizontalAlignment = type.ToCanvasHorizontalAlignment()
};
}
} }
public void DisposeTextGeometry() public void DisposeTextGeometry()
{ {
TextGeometry?.Dispose(); PhoneticCanvasGeometry?.Dispose();
TextGeometry = null; PhoneticCanvasGeometry = null;
OriginalCanvasGeometry?.Dispose();
OriginalCanvasGeometry = null;
TranslatedCanvasGeometry?.Dispose();
TranslatedCanvasGeometry = null;
} }
public void RecreateTextGeometry() public void RecreateTextGeometry()
{ {
DisposeTextGeometry(); DisposeTextGeometry();
if (CanvasTextLayout == null)
if (PhoneticCanvasTextLayout != null)
{ {
return; PhoneticCanvasGeometry = CanvasGeometry.CreateText(PhoneticCanvasTextLayout);
}
if (OriginalCanvasTextLayout != null)
{
OriginalCanvasGeometry = CanvasGeometry.CreateText(OriginalCanvasTextLayout);
}
if (TranslatedCanvasTextLayout != null)
{
TranslatedCanvasGeometry = CanvasGeometry.CreateText(TranslatedCanvasTextLayout);
} }
TextGeometry = CanvasGeometry.CreateText(CanvasTextLayout);
} }
} }
} }

View File

@@ -203,7 +203,7 @@ namespace BetterLyrics.WinUI3.Models
EnvironmentSampleMode = WindowPixelSampleMode.WindowEdge, EnvironmentSampleMode = WindowPixelSampleMode.WindowEdge,
LyricsStyleSettings = new() LyricsStyleSettings = new()
{ {
LyricsFontSize = 20, OriginalLyricsFontSize = 20,
LyricsAlignmentType = TextAlignmentType.Center, LyricsAlignmentType = TextAlignmentType.Center,
}, },
LyricsBackgroundSettings = new LyricsBackgroundSettings LyricsBackgroundSettings = new LyricsBackgroundSettings
@@ -230,7 +230,7 @@ namespace BetterLyrics.WinUI3.Models
LyricsStyleSettings = new LyricsStyleSettings LyricsStyleSettings = new LyricsStyleSettings
{ {
LyricsAlignmentType = TextAlignmentType.Center, LyricsAlignmentType = TextAlignmentType.Center,
LyricsFontSize = 18, OriginalLyricsFontSize = 18,
}, },
LyricsBackgroundSettings = new LyricsBackgroundSettings LyricsBackgroundSettings = new LyricsBackgroundSettings
{ {
@@ -253,7 +253,7 @@ namespace BetterLyrics.WinUI3.Models
LyricsLayoutOrientation = Enums.LyricsLayoutOrientation.Vertical, LyricsLayoutOrientation = Enums.LyricsLayoutOrientation.Vertical,
LyricsStyleSettings = new LyricsStyleSettings LyricsStyleSettings = new LyricsStyleSettings
{ {
LyricsFontSize = 72, OriginalLyricsFontSize = 72,
LyricsAlignmentType = Enums.TextAlignmentType.Center, LyricsAlignmentType = Enums.TextAlignmentType.Center,
}, },
AlbumArtLayoutSettings = new AlbumArtLayoutSettings AlbumArtLayoutSettings = new AlbumArtLayoutSettings

View File

@@ -22,11 +22,11 @@ namespace BetterLyrics.WinUI3.Models.Settings
[ObservableProperty][NotifyPropertyChangedRecipients] public partial LineRenderingType LyricsShadowScope { get; set; } = LineRenderingType.LineStartToCurrentChar; [ObservableProperty][NotifyPropertyChangedRecipients] public partial LineRenderingType LyricsShadowScope { get; set; } = LineRenderingType.LineStartToCurrentChar;
[ObservableProperty][NotifyPropertyChangedRecipients] public partial int LyricsShadowAmount { get; set; } = 8; [ObservableProperty][NotifyPropertyChangedRecipients] public partial int LyricsShadowAmount { get; set; } = 8;
[ObservableProperty][NotifyPropertyChangedRecipients] public partial LineRenderingType LyricsHighlightScope { get; set; } = LineRenderingType.LineStartToCurrentChar; [ObservableProperty][NotifyPropertyChangedRecipients] public partial LineRenderingType OriginalLyricsHighlightScope { get; set; } = LineRenderingType.LineStartToCurrentChar;
[ObservableProperty][NotifyPropertyChangedRecipients] public partial int LyricsHighlightAmount { get; set; } = 100; // 100% 是上界 [ObservableProperty][NotifyPropertyChangedRecipients] public partial int PhoneticLyricsHighlightAmount { get; set; } = 60; // 100% 是上界
[ObservableProperty][NotifyPropertyChangedRecipients] public partial int OriginalLyricsHighlightAmount { get; set; } = 100; // 100% 是上界
[ObservableProperty][NotifyPropertyChangedRecipients] public partial int TranslatedLyricsHighlightAmount { get; set; } = 60; // 100% 是上界
[ObservableProperty][NotifyPropertyChangedRecipients] public partial int LyricsTranslationHighlightAmount { get; set; } = 60; // 100% 是上界
[ObservableProperty][NotifyPropertyChangedRecipients] public partial bool IsLyricsFloatAnimationEnabled { get; set; } = true; [ObservableProperty][NotifyPropertyChangedRecipients] public partial bool IsLyricsFloatAnimationEnabled { get; set; } = true;
[ObservableProperty][NotifyPropertyChangedRecipients] public partial int LyricsFloatAmount { get; set; } = 1; [ObservableProperty][NotifyPropertyChangedRecipients] public partial int LyricsFloatAmount { get; set; } = 1;
@@ -68,9 +68,10 @@ namespace BetterLyrics.WinUI3.Models.Settings
IsLyricsShadowEnabled = this.IsLyricsShadowEnabled, IsLyricsShadowEnabled = this.IsLyricsShadowEnabled,
LyricsShadowScope = this.LyricsShadowScope, LyricsShadowScope = this.LyricsShadowScope,
LyricsShadowAmount = this.LyricsShadowAmount, LyricsShadowAmount = this.LyricsShadowAmount,
LyricsHighlightScope = this.LyricsHighlightScope, OriginalLyricsHighlightScope = this.OriginalLyricsHighlightScope,
LyricsHighlightAmount = this.LyricsHighlightAmount, PhoneticLyricsHighlightAmount = this.PhoneticLyricsHighlightAmount,
LyricsTranslationHighlightAmount = this.LyricsTranslationHighlightAmount, OriginalLyricsHighlightAmount = this.OriginalLyricsHighlightAmount,
TranslatedLyricsHighlightAmount = this.TranslatedLyricsHighlightAmount,
IsLyricsFloatAnimationEnabled = this.IsLyricsFloatAnimationEnabled, IsLyricsFloatAnimationEnabled = this.IsLyricsFloatAnimationEnabled,
LyricsFloatAmount = this.LyricsFloatAmount, LyricsFloatAmount = this.LyricsFloatAmount,
LyricsScrollTopDelay = this.LyricsScrollTopDelay, LyricsScrollTopDelay = this.LyricsScrollTopDelay,

View File

@@ -14,7 +14,9 @@ namespace BetterLyrics.WinUI3.Models.Settings
public partial class LyricsStyleSettings : ObservableRecipient, ICloneable public partial class LyricsStyleSettings : ObservableRecipient, ICloneable
{ {
[ObservableProperty][NotifyPropertyChangedRecipients] public partial bool IsDynamicLyricsFontSize { get; set; } = true; [ObservableProperty][NotifyPropertyChangedRecipients] public partial bool IsDynamicLyricsFontSize { get; set; } = true;
[ObservableProperty][NotifyPropertyChangedRecipients] public partial int LyricsFontSize { get; set; } = 24; [ObservableProperty][NotifyPropertyChangedRecipients] public partial int PhoneticLyricsFontSize { get; set; } = 12;
[ObservableProperty][NotifyPropertyChangedRecipients] public partial int OriginalLyricsFontSize { get; set; } = 24;
[ObservableProperty][NotifyPropertyChangedRecipients] public partial int TranslatedLyricsFontSize { get; set; } = 12;
[ObservableProperty][NotifyPropertyChangedRecipients] public partial TextAlignmentType LyricsAlignmentType { get; set; } = TextAlignmentType.Left; [ObservableProperty][NotifyPropertyChangedRecipients] public partial TextAlignmentType LyricsAlignmentType { get; set; } = TextAlignmentType.Left;
[ObservableProperty][NotifyPropertyChangedRecipients] public partial int LyricsBgFontOpacity { get; set; } = 30; // 30% opacity [ObservableProperty][NotifyPropertyChangedRecipients] public partial int LyricsBgFontOpacity { get; set; } = 30; // 30% opacity
[ObservableProperty][NotifyPropertyChangedRecipients] public partial int LyricsFontStrokeWidth { get; set; } = 0; [ObservableProperty][NotifyPropertyChangedRecipients] public partial int LyricsFontStrokeWidth { get; set; } = 0;
@@ -27,23 +29,19 @@ namespace BetterLyrics.WinUI3.Models.Settings
[ObservableProperty][NotifyPropertyChangedRecipients] public partial LyricsFontWeight LyricsFontWeight { get; set; } = LyricsFontWeight.Bold; [ObservableProperty][NotifyPropertyChangedRecipients] public partial LyricsFontWeight LyricsFontWeight { get; set; } = LyricsFontWeight.Bold;
[ObservableProperty][NotifyPropertyChangedRecipients] public partial double LyricsLineSpacingFactor { get; set; } = 0.5; [ObservableProperty][NotifyPropertyChangedRecipients] public partial double LyricsLineSpacingFactor { get; set; } = 0.5;
[ObservableProperty][NotifyPropertyChangedRecipients] public partial string LyricsTranslationSeparator { get; set; } = StringHelper.NewLine; [ObservableProperty][NotifyPropertyChangedRecipients] public partial string LyricsTranslationSeparator { get; set; } = StringHelper.NewLine;
[ObservableProperty][NotifyPropertyChangedRecipients] public partial string LyricsFontFamily { get; set; } = FontHelper.SystemFontFamilies.FirstOrDefault() ?? ""; [ObservableProperty][NotifyPropertyChangedRecipients] public partial string LyricsCJKFontFamily { get; set; } = FontHelper.SystemFontFamilies.FirstOrDefault() ?? "";
[ObservableProperty][NotifyPropertyChangedRecipients] public partial string LyricsWesternFontFamily { get; set; } = FontHelper.SystemFontFamilies.FirstOrDefault() ?? "";
public LyricsStyleSettings() { } public LyricsStyleSettings() { }
public LyricsStyleSettings(int lyricsFontSize, TextAlignmentType lyricsAlignmentType, int lyricsFontStrokeWidth)
{
LyricsFontSize = lyricsFontSize;
LyricsAlignmentType = lyricsAlignmentType;
LyricsFontStrokeWidth = lyricsFontStrokeWidth;
}
public object Clone() public object Clone()
{ {
return new LyricsStyleSettings return new LyricsStyleSettings
{ {
IsDynamicLyricsFontSize = this.IsDynamicLyricsFontSize, IsDynamicLyricsFontSize = this.IsDynamicLyricsFontSize,
LyricsFontSize = this.LyricsFontSize, PhoneticLyricsFontSize = this.PhoneticLyricsFontSize,
OriginalLyricsFontSize = this.OriginalLyricsFontSize,
TranslatedLyricsFontSize = this.TranslatedLyricsFontSize,
LyricsAlignmentType = this.LyricsAlignmentType, LyricsAlignmentType = this.LyricsAlignmentType,
LyricsBgFontOpacity = this.LyricsBgFontOpacity, LyricsBgFontOpacity = this.LyricsBgFontOpacity,
LyricsFontStrokeWidth = this.LyricsFontStrokeWidth, LyricsFontStrokeWidth = this.LyricsFontStrokeWidth,
@@ -56,7 +54,8 @@ namespace BetterLyrics.WinUI3.Models.Settings
LyricsFontWeight = this.LyricsFontWeight, LyricsFontWeight = this.LyricsFontWeight,
LyricsLineSpacingFactor = this.LyricsLineSpacingFactor, LyricsLineSpacingFactor = this.LyricsLineSpacingFactor,
LyricsTranslationSeparator = this.LyricsTranslationSeparator, LyricsTranslationSeparator = this.LyricsTranslationSeparator,
LyricsFontFamily = this.LyricsFontFamily LyricsCJKFontFamily = this.LyricsCJKFontFamily,
LyricsWesternFontFamily = this.LyricsWesternFontFamily,
}; };
} }
} }

View File

@@ -36,27 +36,22 @@ namespace BetterLyrics.WinUI3.Services.MediaSessionsService
private async Task RefreshTranslationAsync(CancellationToken token) private async Task RefreshTranslationAsync(CancellationToken token)
{ {
TranslationSearchProvider = null; TranslationSearchProvider = null;
_lyricsDataArr.ElementAtOrDefault(0)?.SetDisplayedTextInOriginalText(); _lyricsDataArr.ElementAtOrDefault(0)?.ClearTranslatedText();
LyricsChanged?.Invoke(this, new LyricsChangedEventArgs(CurrentLyricsData)); LyricsChanged?.Invoke(this, new LyricsChangedEventArgs(CurrentLyricsData));
IsTranslating = true; IsTranslating = true;
if (_settingsService.AppSettings.TranslationSettings.IsTranslationEnabled) await SetPhoneticTextAsync(token);
{ await SetTranslatedTextAsync(token);
await SetDisplayedAlongWithTranslationsAsync(token); if (token.IsCancellationRequested) return;
if (token.IsCancellationRequested) return;
}
else
{
_logger.LogInformation("Translation is disabled, showing original lyrics only.");
_lyricsDataArr.ElementAtOrDefault(0)?.SetDisplayedTextInOriginalText();
_langIndex = 0;
}
IsTranslating = false; IsTranslating = false;
LyricsChanged?.Invoke(this, new LyricsChangedEventArgs(CurrentLyricsData)); LyricsChanged?.Invoke(this, new LyricsChangedEventArgs(CurrentLyricsData));
} }
private async Task SetDisplayedAlongWithTranslationsAsync(CancellationToken token) private async Task SetTranslatedTextAsync(CancellationToken token)
{ {
if (!_settingsService.AppSettings.TranslationSettings.IsTranslationEnabled) return;
_logger.LogInformation("Showing translation for lyrics..."); _logger.LogInformation("Showing translation for lyrics...");
string targetLangCode = _settingsService.AppSettings.TranslationSettings.SelectedTargetLanguageCode; string targetLangCode = _settingsService.AppSettings.TranslationSettings.SelectedTargetLanguageCode;
_logger.LogInformation("Target language code: {TargetLangCode}", targetLangCode); _logger.LogInformation("Target language code: {TargetLangCode}", targetLangCode);
@@ -66,30 +61,11 @@ namespace BetterLyrics.WinUI3.Services.MediaSessionsService
string? originalLangCode = LanguageHelper.DetectLanguageCode(originalText); string? originalLangCode = LanguageHelper.DetectLanguageCode(originalText);
_logger.LogInformation("Original language code: {OriginalLangCode}", originalLangCode ?? "null"); _logger.LogInformation("Original language code: {OriginalLangCode}", originalLangCode ?? "null");
if (originalLangCode == "zh" && _settingsService.AppSettings.TranslationSettings.IsChineseRomanizationEnabled)
{
switch (_settingsService.AppSettings.TranslationSettings.ChineseRomanization)
{
case ChineseRomanization.Pinyin:
targetLangCode = "pinyin";
break;
case ChineseRomanization.Jyutping:
targetLangCode = "jyutping";
break;
default:
break;
}
}
else if (originalLangCode == "ja" && _settingsService.AppSettings.TranslationSettings.IsJapaneseRomanizationEnabled)
{
targetLangCode = "romaji";
}
if (originalLangCode == targetLangCode) if (originalLangCode == targetLangCode)
{ {
_logger.LogInformation("Original lyrics already in target language: {TargetLangCode}", targetLangCode); _logger.LogInformation("Original lyrics already in target language: {TargetLangCode}", targetLangCode);
_lyricsDataArr[0].SetDisplayedTextInOriginalText(); _lyricsDataArr[0].ClearTranslatedText();
} }
else else
{ {
@@ -100,12 +76,12 @@ namespace BetterLyrics.WinUI3.Services.MediaSessionsService
_logger.LogInformation("Found translation in lyrics data at index {FoundIndex}", found); _logger.LogInformation("Found translation in lyrics data at index {FoundIndex}", found);
if (_settingsService.AppSettings.TranslationSettings.ShowTranslationOnly) if (_settingsService.AppSettings.TranslationSettings.ShowTranslationOnly)
{ {
_lyricsDataArr[found].SetDisplayedTextInOriginalText(); _lyricsDataArr[found].ClearTranslatedText();
_langIndex = found; _langIndex = found;
} }
else else
{ {
_lyricsDataArr[0].SetDisplayedTextAlongWith(_lyricsDataArr[found], _liveStatesService.LiveStates.LyricsWindowStatus.LyricsStyleSettings.LyricsTranslationSeparator, 50); _lyricsDataArr[0].SetTranslatedText(_lyricsDataArr[found], _liveStatesService.LiveStates.LyricsWindowStatus.LyricsStyleSettings.LyricsTranslationSeparator, 50);
_langIndex = 0; _langIndex = 0;
TranslationSearchProvider = LyricsSearchProvider.ToTranslationSearchProvider(); TranslationSearchProvider = LyricsSearchProvider.ToTranslationSearchProvider();
} }
@@ -123,12 +99,12 @@ namespace BetterLyrics.WinUI3.Services.MediaSessionsService
if (_settingsService.AppSettings.TranslationSettings.ShowTranslationOnly) if (_settingsService.AppSettings.TranslationSettings.ShowTranslationOnly)
{ {
_lyricsDataArr[^1] = _lyricsDataArr[0].CreateLyricsDataFrom(translated); _lyricsDataArr[^1] = _lyricsDataArr[0].CreateLyricsDataFrom(translated);
_lyricsDataArr[^1].SetDisplayedTextInOriginalText(); _lyricsDataArr[^1].ClearTranslatedText();
_langIndex = _lyricsDataArr.Count - 1; _langIndex = _lyricsDataArr.Count - 1;
} }
else else
{ {
_lyricsDataArr[0].SetDisplayedTextAlongWith(translated, _liveStatesService.LiveStates.LyricsWindowStatus.LyricsStyleSettings.LyricsTranslationSeparator); _lyricsDataArr[0].SetTranslation(translated, _liveStatesService.LiveStates.LyricsWindowStatus.LyricsStyleSettings.LyricsTranslationSeparator);
_langIndex = 0; _langIndex = 0;
} }
TranslationSearchProvider = Enums.TranslationSearchProvider.LibreTranslate; TranslationSearchProvider = Enums.TranslationSearchProvider.LibreTranslate;
@@ -141,6 +117,52 @@ namespace BetterLyrics.WinUI3.Services.MediaSessionsService
} }
} }
private async Task SetPhoneticTextAsync(CancellationToken token)
{
_logger.LogInformation("Showing phonetic text for lyrics...");
string targetPhoneticCode = "";
_logger.LogInformation("Target phonetic code: {TargetPhonetic}", targetPhoneticCode);
string? originalText = _lyricsDataArr.FirstOrDefault()?.WrappedOriginalText;
if (originalText == null) return;
string? originalLangCode = LanguageHelper.DetectLanguageCode(originalText);
_logger.LogInformation("Original language code: {OriginalLangCode}", originalLangCode ?? "null");
if (originalLangCode == "zh" && _settingsService.AppSettings.TranslationSettings.IsChineseRomanizationEnabled)
{
switch (_settingsService.AppSettings.TranslationSettings.ChineseRomanization)
{
case ChineseRomanization.Pinyin:
targetPhoneticCode = "pinyin";
break;
case ChineseRomanization.Jyutping:
targetPhoneticCode = "jyutping";
break;
default:
break;
}
}
else if (originalLangCode == "ja" && _settingsService.AppSettings.TranslationSettings.IsJapaneseRomanizationEnabled)
{
targetPhoneticCode = "romaji";
}
if (targetPhoneticCode == "")
{
_lyricsDataArr[0].ClearPhoneticText();
}
// Try get phonetic text from itself first
int found = _translateService.SearchTranslatedLyricsItself(_lyricsDataArr, targetPhoneticCode);
if (found >= 0)
{
_logger.LogInformation("Found translation in lyrics data at index {FoundIndex}", found);
_lyricsDataArr[0].SetPhoneticText(_lyricsDataArr[found], _liveStatesService.LiveStates.LyricsWindowStatus.LyricsStyleSettings.LyricsTranslationSeparator, 50);
_langIndex = 0;
}
}
private async Task RefreshLyricsAsync(CancellationToken token) private async Task RefreshLyricsAsync(CancellationToken token)
{ {
_logger.LogInformation("Refreshing lyrics..."); _logger.LogInformation("Refreshing lyrics...");
@@ -180,8 +202,8 @@ namespace BetterLyrics.WinUI3.Services.MediaSessionsService
_logger.LogInformation("Parsed lyrics: {MultiLangLyricsCount} languages", _lyricsDataArr.Count); _logger.LogInformation("Parsed lyrics: {MultiLangLyricsCount} languages", _lyricsDataArr.Count);
// This ensures that original lyrics are always shown while waiting for translations // This ensures that translation is always reset while waiting for translations
_lyricsDataArr[0].SetDisplayedTextInOriginalText(); _lyricsDataArr[0].ClearTranslatedText();
LyricsChanged?.Invoke(this, new LyricsChangedEventArgs(CurrentLyricsData)); LyricsChanged?.Invoke(this, new LyricsChangedEventArgs(CurrentLyricsData));
ApplyChinesePreference(); ApplyChinesePreference();
UpdateTranslations(); UpdateTranslations();

View File

@@ -571,6 +571,9 @@ If you encounter any problems, please go to the Settings page, About tab, and vi
<data name="SettingsPageChinesePreference.Header" xml:space="preserve"> <data name="SettingsPageChinesePreference.Header" xml:space="preserve">
<value>Convert Chinese to Traditional Chinese</value> <value>Convert Chinese to Traditional Chinese</value>
</data> </data>
<data name="SettingsPageCJK.Header" xml:space="preserve">
<value>CJK Unified Ideograph</value>
</data>
<data name="SettingsPageClickThrough.Header" xml:space="preserve"> <data name="SettingsPageClickThrough.Header" xml:space="preserve">
<value>Click-through</value> <value>Click-through</value>
</data> </data>
@@ -718,6 +721,9 @@ If you encounter any problems, please go to the Settings page, About tab, and vi
<data name="SettingsPageFollowSystem.Content" xml:space="preserve"> <data name="SettingsPageFollowSystem.Content" xml:space="preserve">
<value>Follow system</value> <value>Follow system</value>
</data> </data>
<data name="SettingsPageFontColor.Header" xml:space="preserve">
<value>Font color</value>
</data>
<data name="SettingsPageForceAlwaysOnTop.Description" xml:space="preserve"> <data name="SettingsPageForceAlwaysOnTop.Description" xml:space="preserve">
<value>Keep the lyrics window on top by polling</value> <value>Keep the lyrics window on top by polling</value>
</data> </data>
@@ -814,9 +820,6 @@ If you encounter any problems, please go to the Settings page, About tab, and vi
<data name="SettingsPageLXMusicServer.Text" xml:space="preserve"> <data name="SettingsPageLXMusicServer.Text" xml:space="preserve">
<value>LX Music Server</value> <value>LX Music Server</value>
</data> </data>
<data name="SettingsPageLyrics.Text" xml:space="preserve">
<value>Lyrics style and effect</value>
</data>
<data name="SettingsPageLyricsAlignment.Header" xml:space="preserve"> <data name="SettingsPageLyricsAlignment.Header" xml:space="preserve">
<value>Alignment</value> <value>Alignment</value>
</data> </data>
@@ -824,7 +827,7 @@ If you encounter any problems, please go to the Settings page, About tab, and vi
<value>Lyrics background</value> <value>Lyrics background</value>
</data> </data>
<data name="SettingsPageLyricsBgFontColor.Header" xml:space="preserve"> <data name="SettingsPageLyricsBgFontColor.Header" xml:space="preserve">
<value>Font color (Non-current playback area)</value> <value>Non-current playback area</value>
</data> </data>
<data name="SettingsPageLyricsBgFontOpacity.Header" xml:space="preserve"> <data name="SettingsPageLyricsBgFontOpacity.Header" xml:space="preserve">
<value>Font opacity (Non-current playback area)</value> <value>Font opacity (Non-current playback area)</value>
@@ -860,7 +863,7 @@ If you encounter any problems, please go to the Settings page, About tab, and vi
<value>Extra Light</value> <value>Extra Light</value>
</data> </data>
<data name="SettingsPageLyricsFgFontColor.Header" xml:space="preserve"> <data name="SettingsPageLyricsFgFontColor.Header" xml:space="preserve">
<value>Font color (Current playback area)</value> <value>Current playback area</value>
</data> </data>
<data name="SettingsPageLyricsFgFontColorAdaptiveColored.Content" xml:space="preserve"> <data name="SettingsPageLyricsFgFontColorAdaptiveColored.Content" xml:space="preserve">
<value>Adaptive to lyrics background (Colored)</value> <value>Adaptive to lyrics background (Colored)</value>
@@ -898,6 +901,9 @@ If you encounter any problems, please go to the Settings page, About tab, and vi
<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"> <data name="SettingsPageLyricsHighlightScope.Header" xml:space="preserve">
<value>Original highlight range</value> <value>Original highlight range</value>
</data> </data>
@@ -946,9 +952,6 @@ If you encounter any problems, please go to the Settings page, About tab, and vi
<data name="SettingsPageLyricsShadow.Header" xml:space="preserve"> <data name="SettingsPageLyricsShadow.Header" xml:space="preserve">
<value>Shadows</value> <value>Shadows</value>
</data> </data>
<data name="SettingsPageLyricsStrokeFontColor.Header" xml:space="preserve">
<value>Lyrics stroke color</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>
@@ -1027,6 +1030,9 @@ If you encounter any problems, please go to the Settings page, About tab, and vi
<data name="SettingsPageOpenFolderButton.Content" xml:space="preserve"> <data name="SettingsPageOpenFolderButton.Content" xml:space="preserve">
<value>Open in file explorer</value> <value>Open in file explorer</value>
</data> </data>
<data name="SettingsPageOriginalText.Header" xml:space="preserve">
<value>Original text</value>
</data>
<data name="SettingsPagePaletteGeneratorType.Header" xml:space="preserve"> <data name="SettingsPagePaletteGeneratorType.Header" xml:space="preserve">
<value>Color picker style</value> <value>Color picker style</value>
</data> </data>
@@ -1042,6 +1048,9 @@ If you encounter any problems, please go to the Settings page, About tab, and vi
<data name="SettingsPagePathNotFound.Text" xml:space="preserve"> <data name="SettingsPagePathNotFound.Text" xml:space="preserve">
<value>The path cannot be found on your computer</value> <value>The path cannot be found on your computer</value>
</data> </data>
<data name="SettingsPagePhoneticText.Header" xml:space="preserve">
<value>Phonetic text</value>
</data>
<data name="SettingsPagePinyin.Content" xml:space="preserve"> <data name="SettingsPagePinyin.Content" xml:space="preserve">
<value>Pinyin of Mandarin</value> <value>Pinyin of Mandarin</value>
</data> </data>
@@ -1180,6 +1189,9 @@ If you encounter any problems, please go to the Settings page, About tab, and vi
<data name="SettingsPageStandardMode.Text" xml:space="preserve"> <data name="SettingsPageStandardMode.Text" xml:space="preserve">
<value>Standard mode</value> <value>Standard mode</value>
</data> </data>
<data name="SettingsPageStrokeFontColor.Header" xml:space="preserve">
<value>Stroke color</value>
</data>
<data name="SettingsPageSystemLanguage.Content" xml:space="preserve"> <data name="SettingsPageSystemLanguage.Content" xml:space="preserve">
<value>Default</value> <value>Default</value>
</data> </data>
@@ -1213,6 +1225,9 @@ If you encounter any problems, please go to the Settings page, About tab, and vi
<data name="SettingsPageToggleHotKey.Header" xml:space="preserve"> <data name="SettingsPageToggleHotKey.Header" xml:space="preserve">
<value>Switch in and cut out shortcut keys</value> <value>Switch in and cut out shortcut keys</value>
</data> </data>
<data name="SettingsPageTranslatedText.Header" xml:space="preserve">
<value>Translated text</value>
</data>
<data name="SettingsPageTranslation.Text" xml:space="preserve"> <data name="SettingsPageTranslation.Text" xml:space="preserve">
<value>Lyrics translation</value> <value>Lyrics translation</value>
</data> </data>
@@ -1228,6 +1243,9 @@ If you encounter any problems, please go to the Settings page, About tab, and vi
<data name="SettingsPageVersion.Text" xml:space="preserve"> <data name="SettingsPageVersion.Text" xml:space="preserve">
<value>Version</value> <value>Version</value>
</data> </data>
<data name="SettingsPageWesternChar.Header" xml:space="preserve">
<value>Latin alphabet</value>
</data>
<data name="SettingsPageWidth.Header" xml:space="preserve"> <data name="SettingsPageWidth.Header" xml:space="preserve">
<value>Width</value> <value>Width</value>
</data> </data>

View File

@@ -571,6 +571,9 @@
<data name="SettingsPageChinesePreference.Header" xml:space="preserve"> <data name="SettingsPageChinesePreference.Header" xml:space="preserve">
<value>中国人を伝統的な中国人に変換します</value> <value>中国人を伝統的な中国人に変換します</value>
</data> </data>
<data name="SettingsPageCJK.Header" xml:space="preserve">
<value>CJK統一漢字</value>
</data>
<data name="SettingsPageClickThrough.Header" xml:space="preserve"> <data name="SettingsPageClickThrough.Header" xml:space="preserve">
<value>クリックスルー</value> <value>クリックスルー</value>
</data> </data>
@@ -718,6 +721,9 @@
<data name="SettingsPageFollowSystem.Content" xml:space="preserve"> <data name="SettingsPageFollowSystem.Content" xml:space="preserve">
<value>システムをフォローします</value> <value>システムをフォローします</value>
</data> </data>
<data name="SettingsPageFontColor.Header" xml:space="preserve">
<value>フォントの色</value>
</data>
<data name="SettingsPageForceAlwaysOnTop.Description" xml:space="preserve"> <data name="SettingsPageForceAlwaysOnTop.Description" xml:space="preserve">
<value>ポーリングで歌詞ウィンドウを一番上に保ちましょう</value> <value>ポーリングで歌詞ウィンドウを一番上に保ちましょう</value>
</data> </data>
@@ -814,9 +820,6 @@
<data name="SettingsPageLXMusicServer.Text" xml:space="preserve"> <data name="SettingsPageLXMusicServer.Text" xml:space="preserve">
<value>LX Music Server</value> <value>LX Music Server</value>
</data> </data>
<data name="SettingsPageLyrics.Text" xml:space="preserve">
<value>歌詞のスタイルと効果</value>
</data>
<data name="SettingsPageLyricsAlignment.Header" xml:space="preserve"> <data name="SettingsPageLyricsAlignment.Header" xml:space="preserve">
<value>アライメント</value> <value>アライメント</value>
</data> </data>
@@ -824,7 +827,7 @@
<value>歌詞の背景</value> <value>歌詞の背景</value>
</data> </data>
<data name="SettingsPageLyricsBgFontColor.Header" xml:space="preserve"> <data name="SettingsPageLyricsBgFontColor.Header" xml:space="preserve">
<value>フォントカラー(非電流再生エリア</value> <value>非電流再生エリア</value>
</data> </data>
<data name="SettingsPageLyricsBgFontOpacity.Header" xml:space="preserve"> <data name="SettingsPageLyricsBgFontOpacity.Header" xml:space="preserve">
<value>フォントの不透明度(非電流再生エリア)</value> <value>フォントの不透明度(非電流再生エリア)</value>
@@ -860,7 +863,7 @@
<value>余分な光</value> <value>余分な光</value>
</data> </data>
<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"> <data name="SettingsPageLyricsFgFontColorAdaptiveColored.Content" xml:space="preserve">
<value>歌詞の背景に適応する(色付き)</value> <value>歌詞の背景に適応する(色付き)</value>
@@ -898,6 +901,9 @@
<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"> <data name="SettingsPageLyricsHighlightScope.Header" xml:space="preserve">
<value>オリジナルのハイライト範囲</value> <value>オリジナルのハイライト範囲</value>
</data> </data>
@@ -946,9 +952,6 @@
<data name="SettingsPageLyricsShadow.Header" xml:space="preserve"> <data name="SettingsPageLyricsShadow.Header" xml:space="preserve">
<value>影だ</value> <value>影だ</value>
</data> </data>
<data name="SettingsPageLyricsStrokeFontColor.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>
@@ -1027,6 +1030,9 @@
<data name="SettingsPageOpenFolderButton.Content" xml:space="preserve"> <data name="SettingsPageOpenFolderButton.Content" xml:space="preserve">
<value>ファイルエクスプローラーで開きます</value> <value>ファイルエクスプローラーで開きます</value>
</data> </data>
<data name="SettingsPageOriginalText.Header" xml:space="preserve">
<value>原文</value>
</data>
<data name="SettingsPagePaletteGeneratorType.Header" xml:space="preserve"> <data name="SettingsPagePaletteGeneratorType.Header" xml:space="preserve">
<value>カラーピックスタイル</value> <value>カラーピックスタイル</value>
</data> </data>
@@ -1042,6 +1048,9 @@
<data name="SettingsPagePathNotFound.Text" xml:space="preserve"> <data name="SettingsPagePathNotFound.Text" xml:space="preserve">
<value>パスはコンピューターでは見つかりません</value> <value>パスはコンピューターでは見つかりません</value>
</data> </data>
<data name="SettingsPagePhoneticText.Header" xml:space="preserve">
<value>発音</value>
</data>
<data name="SettingsPagePinyin.Content" xml:space="preserve"> <data name="SettingsPagePinyin.Content" xml:space="preserve">
<value>マンダリンのピンイン</value> <value>マンダリンのピンイン</value>
</data> </data>
@@ -1180,6 +1189,9 @@
<data name="SettingsPageStandardMode.Text" xml:space="preserve"> <data name="SettingsPageStandardMode.Text" xml:space="preserve">
<value>標準モード</value> <value>標準モード</value>
</data> </data>
<data name="SettingsPageStrokeFontColor.Header" xml:space="preserve">
<value>ストロークカラー</value>
</data>
<data name="SettingsPageSystemLanguage.Content" xml:space="preserve"> <data name="SettingsPageSystemLanguage.Content" xml:space="preserve">
<value>デフォルト</value> <value>デフォルト</value>
</data> </data>
@@ -1213,6 +1225,9 @@
<data name="SettingsPageToggleHotKey.Header" xml:space="preserve"> <data name="SettingsPageToggleHotKey.Header" xml:space="preserve">
<value>ショートカットキーを切り込んで切り取ります</value> <value>ショートカットキーを切り込んで切り取ります</value>
</data> </data>
<data name="SettingsPageTranslatedText.Header" xml:space="preserve">
<value>译文</value>
</data>
<data name="SettingsPageTranslation.Text" xml:space="preserve"> <data name="SettingsPageTranslation.Text" xml:space="preserve">
<value>歌詞翻訳</value> <value>歌詞翻訳</value>
</data> </data>
@@ -1228,6 +1243,9 @@
<data name="SettingsPageVersion.Text" xml:space="preserve"> <data name="SettingsPageVersion.Text" xml:space="preserve">
<value>バージョン</value> <value>バージョン</value>
</data> </data>
<data name="SettingsPageWesternChar.Header" xml:space="preserve">
<value>英字</value>
</data>
<data name="SettingsPageWidth.Header" xml:space="preserve"> <data name="SettingsPageWidth.Header" xml:space="preserve">
<value>幅</value> <value>幅</value>
</data> </data>

View File

@@ -571,6 +571,9 @@
<data name="SettingsPageChinesePreference.Header" xml:space="preserve"> <data name="SettingsPageChinesePreference.Header" xml:space="preserve">
<value>중국어를 전통적인 중국어로 전환합니다</value> <value>중국어를 전통적인 중국어로 전환합니다</value>
</data> </data>
<data name="SettingsPageCJK.Header" xml:space="preserve">
<value>한중일 통합 이데오그래프</value>
</data>
<data name="SettingsPageClickThrough.Header" xml:space="preserve"> <data name="SettingsPageClickThrough.Header" xml:space="preserve">
<value>클릭률</value> <value>클릭률</value>
</data> </data>
@@ -718,6 +721,9 @@
<data name="SettingsPageFollowSystem.Content" xml:space="preserve"> <data name="SettingsPageFollowSystem.Content" xml:space="preserve">
<value>시스템을 따르십시오</value> <value>시스템을 따르십시오</value>
</data> </data>
<data name="SettingsPageFontColor.Header" xml:space="preserve">
<value>폰트 색상</value>
</data>
<data name="SettingsPageForceAlwaysOnTop.Description" xml:space="preserve"> <data name="SettingsPageForceAlwaysOnTop.Description" xml:space="preserve">
<value>투표를 통해 가사 창을 맨 위에 두세요</value> <value>투표를 통해 가사 창을 맨 위에 두세요</value>
</data> </data>
@@ -814,9 +820,6 @@
<data name="SettingsPageLXMusicServer.Text" xml:space="preserve"> <data name="SettingsPageLXMusicServer.Text" xml:space="preserve">
<value>LX 음악 서버</value> <value>LX 음악 서버</value>
</data> </data>
<data name="SettingsPageLyrics.Text" xml:space="preserve">
<value>가사 스타일과 효과</value>
</data>
<data name="SettingsPageLyricsAlignment.Header" xml:space="preserve"> <data name="SettingsPageLyricsAlignment.Header" xml:space="preserve">
<value>조정</value> <value>조정</value>
</data> </data>
@@ -824,7 +827,7 @@
<value>가사 배경</value> <value>가사 배경</value>
</data> </data>
<data name="SettingsPageLyricsBgFontColor.Header" xml:space="preserve"> <data name="SettingsPageLyricsBgFontColor.Header" xml:space="preserve">
<value>글꼴 색상 (비 전류 재생 영역)</value> <value>비 전류 재생 영역</value>
</data> </data>
<data name="SettingsPageLyricsBgFontOpacity.Header" xml:space="preserve"> <data name="SettingsPageLyricsBgFontOpacity.Header" xml:space="preserve">
<value>글꼴 불투명 (비 전류 재생 영역)</value> <value>글꼴 불투명 (비 전류 재생 영역)</value>
@@ -860,7 +863,7 @@
<value>여분의 빛</value> <value>여분의 빛</value>
</data> </data>
<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"> <data name="SettingsPageLyricsFgFontColorAdaptiveColored.Content" xml:space="preserve">
<value>가사 배경 (색상)에 적응</value> <value>가사 배경 (색상)에 적응</value>
@@ -898,6 +901,9 @@
<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"> <data name="SettingsPageLyricsHighlightScope.Header" xml:space="preserve">
<value>원래 하이라이트 범위</value> <value>원래 하이라이트 범위</value>
</data> </data>
@@ -946,9 +952,6 @@
<data name="SettingsPageLyricsShadow.Header" xml:space="preserve"> <data name="SettingsPageLyricsShadow.Header" xml:space="preserve">
<value>그림자</value> <value>그림자</value>
</data> </data>
<data name="SettingsPageLyricsStrokeFontColor.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>
@@ -1027,6 +1030,9 @@
<data name="SettingsPageOpenFolderButton.Content" xml:space="preserve"> <data name="SettingsPageOpenFolderButton.Content" xml:space="preserve">
<value>파일 탐색기에서 열립니다</value> <value>파일 탐색기에서 열립니다</value>
</data> </data>
<data name="SettingsPageOriginalText.Header" xml:space="preserve">
<value>원본</value>
</data>
<data name="SettingsPagePaletteGeneratorType.Header" xml:space="preserve"> <data name="SettingsPagePaletteGeneratorType.Header" xml:space="preserve">
<value>색상 선택 스타일</value> <value>색상 선택 스타일</value>
</data> </data>
@@ -1042,6 +1048,9 @@
<data name="SettingsPagePathNotFound.Text" xml:space="preserve"> <data name="SettingsPagePathNotFound.Text" xml:space="preserve">
<value>경로는 컴퓨터에서 찾을 수 없습니다</value> <value>경로는 컴퓨터에서 찾을 수 없습니다</value>
</data> </data>
<data name="SettingsPagePhoneticText.Header" xml:space="preserve">
<value>발성</value>
</data>
<data name="SettingsPagePinyin.Content" xml:space="preserve"> <data name="SettingsPagePinyin.Content" xml:space="preserve">
<value>만다린의 피니 인</value> <value>만다린의 피니 인</value>
</data> </data>
@@ -1180,6 +1189,9 @@
<data name="SettingsPageStandardMode.Text" xml:space="preserve"> <data name="SettingsPageStandardMode.Text" xml:space="preserve">
<value>표준 모드</value> <value>표준 모드</value>
</data> </data>
<data name="SettingsPageStrokeFontColor.Header" xml:space="preserve">
<value>윤곽선 색상</value>
</data>
<data name="SettingsPageSystemLanguage.Content" xml:space="preserve"> <data name="SettingsPageSystemLanguage.Content" xml:space="preserve">
<value>기본</value> <value>기본</value>
</data> </data>
@@ -1213,6 +1225,9 @@
<data name="SettingsPageToggleHotKey.Header" xml:space="preserve"> <data name="SettingsPageToggleHotKey.Header" xml:space="preserve">
<value>바로 가기 키를 자르고 잘라냅니다</value> <value>바로 가기 키를 자르고 잘라냅니다</value>
</data> </data>
<data name="SettingsPageTranslatedText.Header" xml:space="preserve">
<value>번역</value>
</data>
<data name="SettingsPageTranslation.Text" xml:space="preserve"> <data name="SettingsPageTranslation.Text" xml:space="preserve">
<value>가사 번역</value> <value>가사 번역</value>
</data> </data>
@@ -1228,6 +1243,9 @@
<data name="SettingsPageVersion.Text" xml:space="preserve"> <data name="SettingsPageVersion.Text" xml:space="preserve">
<value>버전</value> <value>버전</value>
</data> </data>
<data name="SettingsPageWesternChar.Header" xml:space="preserve">
<value>라틴 알파벳</value>
</data>
<data name="SettingsPageWidth.Header" xml:space="preserve"> <data name="SettingsPageWidth.Header" xml:space="preserve">
<value>너비</value> <value>너비</value>
</data> </data>

View File

@@ -571,6 +571,9 @@
<data name="SettingsPageChinesePreference.Header" xml:space="preserve"> <data name="SettingsPageChinesePreference.Header" xml:space="preserve">
<value>中文转换为繁体</value> <value>中文转换为繁体</value>
</data> </data>
<data name="SettingsPageCJK.Header" xml:space="preserve">
<value>中日韩统一表意文字</value>
</data>
<data name="SettingsPageClickThrough.Header" xml:space="preserve"> <data name="SettingsPageClickThrough.Header" xml:space="preserve">
<value>点击穿透</value> <value>点击穿透</value>
</data> </data>
@@ -718,6 +721,9 @@
<data name="SettingsPageFollowSystem.Content" xml:space="preserve"> <data name="SettingsPageFollowSystem.Content" xml:space="preserve">
<value>跟随系统</value> <value>跟随系统</value>
</data> </data>
<data name="SettingsPageFontColor.Header" xml:space="preserve">
<value>字体颜色</value>
</data>
<data name="SettingsPageForceAlwaysOnTop.Description" xml:space="preserve"> <data name="SettingsPageForceAlwaysOnTop.Description" xml:space="preserve">
<value>通过轮询方式使歌词窗口保持置于顶层状态</value> <value>通过轮询方式使歌词窗口保持置于顶层状态</value>
</data> </data>
@@ -814,9 +820,6 @@
<data name="SettingsPageLXMusicServer.Text" xml:space="preserve"> <data name="SettingsPageLXMusicServer.Text" xml:space="preserve">
<value>LX 音乐服务器</value> <value>LX 音乐服务器</value>
</data> </data>
<data name="SettingsPageLyrics.Text" xml:space="preserve">
<value>歌词样式与动效</value>
</data>
<data name="SettingsPageLyricsAlignment.Header" xml:space="preserve"> <data name="SettingsPageLyricsAlignment.Header" xml:space="preserve">
<value>对齐方式</value> <value>对齐方式</value>
</data> </data>
@@ -824,7 +827,7 @@
<value>歌词背景</value> <value>歌词背景</value>
</data> </data>
<data name="SettingsPageLyricsBgFontColor.Header" xml:space="preserve"> <data name="SettingsPageLyricsBgFontColor.Header" xml:space="preserve">
<value>字体颜色(非当前播放区域</value> <value>非当前播放区域</value>
</data> </data>
<data name="SettingsPageLyricsBgFontOpacity.Header" xml:space="preserve"> <data name="SettingsPageLyricsBgFontOpacity.Header" xml:space="preserve">
<value>字体不透明度(非当前播放区域)</value> <value>字体不透明度(非当前播放区域)</value>
@@ -860,7 +863,7 @@
<value>超细</value> <value>超细</value>
</data> </data>
<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"> <data name="SettingsPageLyricsFgFontColorAdaptiveColored.Content" xml:space="preserve">
<value>适应歌词背景(彩色)</value> <value>适应歌词背景(彩色)</value>
@@ -898,6 +901,9 @@
<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"> <data name="SettingsPageLyricsHighlightScope.Header" xml:space="preserve">
<value>原文高亮显示范围</value> <value>原文高亮显示范围</value>
</data> </data>
@@ -946,9 +952,6 @@
<data name="SettingsPageLyricsShadow.Header" xml:space="preserve"> <data name="SettingsPageLyricsShadow.Header" xml:space="preserve">
<value>阴影</value> <value>阴影</value>
</data> </data>
<data name="SettingsPageLyricsStrokeFontColor.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>
@@ -1027,6 +1030,9 @@
<data name="SettingsPageOpenFolderButton.Content" xml:space="preserve"> <data name="SettingsPageOpenFolderButton.Content" xml:space="preserve">
<value>在文件资源管理器中打开</value> <value>在文件资源管理器中打开</value>
</data> </data>
<data name="SettingsPageOriginalText.Header" xml:space="preserve">
<value>原文</value>
</data>
<data name="SettingsPagePaletteGeneratorType.Header" xml:space="preserve"> <data name="SettingsPagePaletteGeneratorType.Header" xml:space="preserve">
<value>取色风格</value> <value>取色风格</value>
</data> </data>
@@ -1042,6 +1048,9 @@
<data name="SettingsPagePathNotFound.Text" xml:space="preserve"> <data name="SettingsPagePathNotFound.Text" xml:space="preserve">
<value>无法在您的计算机中找到该路径</value> <value>无法在您的计算机中找到该路径</value>
</data> </data>
<data name="SettingsPagePhoneticText.Header" xml:space="preserve">
<value>注音</value>
</data>
<data name="SettingsPagePinyin.Content" xml:space="preserve"> <data name="SettingsPagePinyin.Content" xml:space="preserve">
<value>普通话拼音</value> <value>普通话拼音</value>
</data> </data>
@@ -1180,6 +1189,9 @@
<data name="SettingsPageStandardMode.Text" xml:space="preserve"> <data name="SettingsPageStandardMode.Text" xml:space="preserve">
<value>标准模式</value> <value>标准模式</value>
</data> </data>
<data name="SettingsPageStrokeFontColor.Header" xml:space="preserve">
<value>描边颜色</value>
</data>
<data name="SettingsPageSystemLanguage.Content" xml:space="preserve"> <data name="SettingsPageSystemLanguage.Content" xml:space="preserve">
<value>默认</value> <value>默认</value>
</data> </data>
@@ -1213,6 +1225,9 @@
<data name="SettingsPageToggleHotKey.Header" xml:space="preserve"> <data name="SettingsPageToggleHotKey.Header" xml:space="preserve">
<value>切入与切出快捷键</value> <value>切入与切出快捷键</value>
</data> </data>
<data name="SettingsPageTranslatedText.Header" xml:space="preserve">
<value>译文</value>
</data>
<data name="SettingsPageTranslation.Text" xml:space="preserve"> <data name="SettingsPageTranslation.Text" xml:space="preserve">
<value>歌词翻译</value> <value>歌词翻译</value>
</data> </data>
@@ -1228,6 +1243,9 @@
<data name="SettingsPageVersion.Text" xml:space="preserve"> <data name="SettingsPageVersion.Text" xml:space="preserve">
<value>版本号</value> <value>版本号</value>
</data> </data>
<data name="SettingsPageWesternChar.Header" xml:space="preserve">
<value>拉丁字母</value>
</data>
<data name="SettingsPageWidth.Header" xml:space="preserve"> <data name="SettingsPageWidth.Header" xml:space="preserve">
<value>宽度</value> <value>宽度</value>
</data> </data>

View File

@@ -571,6 +571,9 @@
<data name="SettingsPageChinesePreference.Header" xml:space="preserve"> <data name="SettingsPageChinesePreference.Header" xml:space="preserve">
<value>中文轉換為繁體</value> <value>中文轉換為繁體</value>
</data> </data>
<data name="SettingsPageCJK.Header" xml:space="preserve">
<value>中日韓統一表意文字</value>
</data>
<data name="SettingsPageClickThrough.Header" xml:space="preserve"> <data name="SettingsPageClickThrough.Header" xml:space="preserve">
<value>點擊穿透</value> <value>點擊穿透</value>
</data> </data>
@@ -718,6 +721,9 @@
<data name="SettingsPageFollowSystem.Content" xml:space="preserve"> <data name="SettingsPageFollowSystem.Content" xml:space="preserve">
<value>跟隨系統</value> <value>跟隨系統</value>
</data> </data>
<data name="SettingsPageFontColor.Header" xml:space="preserve">
<value>字體顏色</value>
</data>
<data name="SettingsPageForceAlwaysOnTop.Description" xml:space="preserve"> <data name="SettingsPageForceAlwaysOnTop.Description" xml:space="preserve">
<value>透過輪詢方式使歌詞視窗保持置於頂層狀態</value> <value>透過輪詢方式使歌詞視窗保持置於頂層狀態</value>
</data> </data>
@@ -814,9 +820,6 @@
<data name="SettingsPageLXMusicServer.Text" xml:space="preserve"> <data name="SettingsPageLXMusicServer.Text" xml:space="preserve">
<value>LX 音樂服務器</value> <value>LX 音樂服務器</value>
</data> </data>
<data name="SettingsPageLyrics.Text" xml:space="preserve">
<value>歌詞樣式與動效</value>
</data>
<data name="SettingsPageLyricsAlignment.Header" xml:space="preserve"> <data name="SettingsPageLyricsAlignment.Header" xml:space="preserve">
<value>對齊方式</value> <value>對齊方式</value>
</data> </data>
@@ -824,7 +827,7 @@
<value>歌詞背景</value> <value>歌詞背景</value>
</data> </data>
<data name="SettingsPageLyricsBgFontColor.Header" xml:space="preserve"> <data name="SettingsPageLyricsBgFontColor.Header" xml:space="preserve">
<value>字體顏色(非當前播放區域</value> <value>非當前播放區域</value>
</data> </data>
<data name="SettingsPageLyricsBgFontOpacity.Header" xml:space="preserve"> <data name="SettingsPageLyricsBgFontOpacity.Header" xml:space="preserve">
<value>字體不透明度(非目前播放區域)</value> <value>字體不透明度(非目前播放區域)</value>
@@ -860,7 +863,7 @@
<value>超細</value> <value>超細</value>
</data> </data>
<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"> <data name="SettingsPageLyricsFgFontColorAdaptiveColored.Content" xml:space="preserve">
<value>適應歌詞背景(彩色)</value> <value>適應歌詞背景(彩色)</value>
@@ -898,6 +901,9 @@
<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"> <data name="SettingsPageLyricsHighlightScope.Header" xml:space="preserve">
<value>原文高亮顯示範圍</value> <value>原文高亮顯示範圍</value>
</data> </data>
@@ -946,9 +952,6 @@
<data name="SettingsPageLyricsShadow.Header" xml:space="preserve"> <data name="SettingsPageLyricsShadow.Header" xml:space="preserve">
<value>陰影</value> <value>陰影</value>
</data> </data>
<data name="SettingsPageLyricsStrokeFontColor.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>
@@ -1027,6 +1030,9 @@
<data name="SettingsPageOpenFolderButton.Content" xml:space="preserve"> <data name="SettingsPageOpenFolderButton.Content" xml:space="preserve">
<value>在檔案總管中開啟</value> <value>在檔案總管中開啟</value>
</data> </data>
<data name="SettingsPageOriginalText.Header" xml:space="preserve">
<value>原文</value>
</data>
<data name="SettingsPagePaletteGeneratorType.Header" xml:space="preserve"> <data name="SettingsPagePaletteGeneratorType.Header" xml:space="preserve">
<value>取色風格</value> <value>取色風格</value>
</data> </data>
@@ -1042,6 +1048,9 @@
<data name="SettingsPagePathNotFound.Text" xml:space="preserve"> <data name="SettingsPagePathNotFound.Text" xml:space="preserve">
<value>無法在您的電腦中找到該路徑</value> <value>無法在您的電腦中找到該路徑</value>
</data> </data>
<data name="SettingsPagePhoneticText.Header" xml:space="preserve">
<value>注音</value>
</data>
<data name="SettingsPagePinyin.Content" xml:space="preserve"> <data name="SettingsPagePinyin.Content" xml:space="preserve">
<value>普通話拼音</value> <value>普通話拼音</value>
</data> </data>
@@ -1180,6 +1189,9 @@
<data name="SettingsPageStandardMode.Text" xml:space="preserve"> <data name="SettingsPageStandardMode.Text" xml:space="preserve">
<value>標準模式</value> <value>標準模式</value>
</data> </data>
<data name="SettingsPageStrokeFontColor.Header" xml:space="preserve">
<value>描邊顏色</value>
</data>
<data name="SettingsPageSystemLanguage.Content" xml:space="preserve"> <data name="SettingsPageSystemLanguage.Content" xml:space="preserve">
<value>預設</value> <value>預設</value>
</data> </data>
@@ -1213,6 +1225,9 @@
<data name="SettingsPageToggleHotKey.Header" xml:space="preserve"> <data name="SettingsPageToggleHotKey.Header" xml:space="preserve">
<value>切入與切出快捷鍵</value> <value>切入與切出快捷鍵</value>
</data> </data>
<data name="SettingsPageTranslatedText.Header" xml:space="preserve">
<value>譯文</value>
</data>
<data name="SettingsPageTranslation.Text" xml:space="preserve"> <data name="SettingsPageTranslation.Text" xml:space="preserve">
<value>歌詞翻譯</value> <value>歌詞翻譯</value>
</data> </data>
@@ -1228,6 +1243,9 @@
<data name="SettingsPageVersion.Text" xml:space="preserve"> <data name="SettingsPageVersion.Text" xml:space="preserve">
<value>版本號</value> <value>版本號</value>
</data> </data>
<data name="SettingsPageWesternChar.Header" xml:space="preserve">
<value>拉丁字母</value>
</data>
<data name="SettingsPageWidth.Header" xml:space="preserve"> <data name="SettingsPageWidth.Header" xml:space="preserve">
<value>寬度</value> <value>寬度</value>
</data> </data>

View File

@@ -54,13 +54,11 @@ namespace BetterLyrics.WinUI3.ViewModels.LyricsRendererViewModel
if (_liveStatesService.LiveStates.LyricsWindowStatus.LyricsEffectSettings.Is3DLyricsEnabled) if (_liveStatesService.LiveStates.LyricsWindowStatus.LyricsEffectSettings.Is3DLyricsEnabled)
{ {
using var perspectiveEffect = new Transform3DEffect combinedDs.DrawImage(new Transform3DEffect
{ {
Source = blurredLyrics, Source = blurredLyrics,
TransformMatrix = _lyrics3DMatrix TransformMatrix = _lyrics3DMatrix
}; });
combinedDs.DrawImage(perspectiveEffect);
} }
else else
{ {
@@ -321,7 +319,7 @@ namespace BetterLyrics.WinUI3.ViewModels.LyricsRendererViewModel
var line = _currentLyricsData?.LyricsLines.ElementAtOrDefault(i); var line = _currentLyricsData?.LyricsLines.ElementAtOrDefault(i);
if (line == null) continue; if (line == null) continue;
var textLayout = line.CanvasTextLayout; var textLayout = line.OriginalCanvasTextLayout;
if (textLayout == null) continue; if (textLayout == null) continue;
double layoutWidth = (double)textLayout.LayoutBounds.Width; double layoutWidth = (double)textLayout.LayoutBounds.Width;
@@ -335,15 +333,16 @@ namespace BetterLyrics.WinUI3.ViewModels.LyricsRendererViewModel
ds.Transform = ds.Transform =
Matrix3x2.CreateScale((float)line.ScaleTransition.Value, line.CenterPosition) Matrix3x2.CreateScale((float)line.ScaleTransition.Value, line.CenterPosition)
* Matrix3x2.CreateRotation((float)line.AngleTransition.Value, * Matrix3x2.CreateRotation((float)line.AngleTransition.Value,
currentPlayingLine.Position.WithX(_liveStatesService.LiveStates.LyricsWindowStatus.LyricsEffectSettings.FanLyricsAngle < 0 ? (float)_maxLyricsWidth : 0)) currentPlayingLine.OriginalPosition.WithX(_liveStatesService.LiveStates.LyricsWindowStatus.LyricsEffectSettings.FanLyricsAngle < 0 ? (float)_maxLyricsWidth : 0))
* Matrix3x2.CreateTranslation((float)_lyricsXTransition.Value, (float)yOffset); * Matrix3x2.CreateTranslation((float)_lyricsXTransition.Value, (float)yOffset);
using var combined = new CanvasCommandList(control); using var combined = new CanvasCommandList(control);
using var combinedDs = combined.CreateDrawingSession(); using var combinedDs = combined.CreateDrawingSession();
// 先铺一层带默认透明度的已经加了模糊效果的歌词作为最底层(背景歌词层次) // 先铺一层带默认透明度的已经加了模糊效果的歌词作为最底层(背景歌词层次)
using var backgroundFontEffect = CanvasHelper.CreateFontEffect(line, control, _strokeFontColor, using var backgroundFontEffect = CanvasHelper.CreateFontEffect(line, control, _strokeFontColor,
_liveStatesService.LiveStates.LyricsWindowStatus.LyricsStyleSettings.LyricsFontStrokeWidth, _bgFontColor); _liveStatesService.LiveStates.LyricsWindowStatus.LyricsStyleSettings.LyricsFontStrokeWidth, _bgFontColor);
using var backgroundEffect = CanvasHelper.CreateBackgroundEffect(line, backgroundFontEffect, _lyricsOpacityTransition.Value); using var backgroundEffect = CanvasHelper.CreateBackgroundEffect(line, backgroundFontEffect, _lyricsOpacityTransition.Value);
combinedDs.DrawImage(backgroundEffect); combinedDs.DrawImage(backgroundEffect);
@@ -357,17 +356,24 @@ namespace BetterLyrics.WinUI3.ViewModels.LyricsRendererViewModel
_liveStatesService.LiveStates.LyricsWindowStatus.LyricsEffectSettings.IsLyricsLineFadeEnabled); _liveStatesService.LiveStates.LyricsWindowStatus.LyricsEffectSettings.IsLyricsLineFadeEnabled);
using var lineMask = CanvasHelper.CreateLineMask(control, line); using var lineMask = CanvasHelper.CreateLineMask(control, line);
using var foregroundFontEffect = CanvasHelper.CreateFontEffect(line, control, _strokeFontColor, using var foregroundFontEffect = CanvasHelper.CreateFontEffect(line, control, _strokeFontColor,
_liveStatesService.LiveStates.LyricsWindowStatus.LyricsStyleSettings.LyricsFontStrokeWidth, _fgFontColor); _liveStatesService.LiveStates.LyricsWindowStatus.LyricsStyleSettings.LyricsFontStrokeWidth, _fgFontColor);
using var effectLayer = new CanvasCommandList(control); using var effectLayer = new CanvasCommandList(control);
using var effectLayerDs = effectLayer.CreateDrawingSession(); using var effectLayerDs = effectLayer.CreateDrawingSession();
if (line.OriginalText != line.DisplayedText && _liveStatesService.LiveStates.LyricsWindowStatus.LyricsEffectSettings.LyricsTranslationHighlightAmount != 0) if (line.PhoneticText != "" && _liveStatesService.LiveStates.LyricsWindowStatus.LyricsEffectSettings.PhoneticLyricsHighlightAmount != 0)
{ {
using var translationHighlightMask = CanvasHelper.CreateTranslationHighlightMask(control, line); using var phoneticHighlightMask = CanvasHelper.CreatePhoneticHighlightMask(control, line);
using var foregroundTranslationHighlightEffect = CanvasHelper.CreateForegroundHighlightEffect(foregroundFontEffect, translationHighlightMask, using var foregroundPhoneticHighlightEffect = CanvasHelper.CreateForegroundHighlightEffect(foregroundFontEffect, phoneticHighlightMask,
_liveStatesService.LiveStates.LyricsWindowStatus.LyricsEffectSettings.LyricsTranslationHighlightAmount / 100.0); _liveStatesService.LiveStates.LyricsWindowStatus.LyricsEffectSettings.PhoneticLyricsHighlightAmount / 100.0);
effectLayerDs.DrawImage(foregroundTranslationHighlightEffect); effectLayerDs.DrawImage(foregroundPhoneticHighlightEffect);
}
if (line.TranslatedText != "" && _liveStatesService.LiveStates.LyricsWindowStatus.LyricsEffectSettings.TranslatedLyricsHighlightAmount != 0)
{
using var translatedHighlightMask = CanvasHelper.CreateTranslatedHighlightMask(control, line);
using var foregroundTranslatedHighlightEffect = CanvasHelper.CreateForegroundHighlightEffect(foregroundFontEffect, translatedHighlightMask,
_liveStatesService.LiveStates.LyricsWindowStatus.LyricsEffectSettings.TranslatedLyricsHighlightAmount / 100.0);
effectLayerDs.DrawImage(foregroundTranslatedHighlightEffect);
} }
if (_liveStatesService.LiveStates.LyricsWindowStatus.LyricsEffectSettings.IsLyricsShadowEnabled) if (_liveStatesService.LiveStates.LyricsWindowStatus.LyricsEffectSettings.IsLyricsShadowEnabled)
{ {
@@ -385,12 +391,12 @@ namespace BetterLyrics.WinUI3.ViewModels.LyricsRendererViewModel
_liveStatesService.LiveStates.LyricsWindowStatus.LyricsEffectSettings.LyricsGlowEffectAmount); _liveStatesService.LiveStates.LyricsWindowStatus.LyricsEffectSettings.LyricsGlowEffectAmount);
effectLayerDs.DrawImage(foregroundBlurEffect); effectLayerDs.DrawImage(foregroundBlurEffect);
} }
if (_liveStatesService.LiveStates.LyricsWindowStatus.LyricsEffectSettings.LyricsHighlightAmount != 0) if (_liveStatesService.LiveStates.LyricsWindowStatus.LyricsEffectSettings.OriginalLyricsHighlightAmount != 0)
{ {
var highlightEffectMask = CanvasHelper.GetAlphaMask(control, charMask, lineStartToCharMask, lineMask, var highlightEffectMask = CanvasHelper.GetAlphaMask(control, charMask, lineStartToCharMask, lineMask,
_liveStatesService.LiveStates.LyricsWindowStatus.LyricsEffectSettings.LyricsHighlightScope); _liveStatesService.LiveStates.LyricsWindowStatus.LyricsEffectSettings.OriginalLyricsHighlightScope);
using var foregroundHighlightEffect = CanvasHelper.CreateForegroundHighlightEffect(foregroundFontEffect, highlightEffectMask, using var foregroundHighlightEffect = CanvasHelper.CreateForegroundHighlightEffect(foregroundFontEffect, highlightEffectMask,
_liveStatesService.LiveStates.LyricsWindowStatus.LyricsEffectSettings.LyricsHighlightAmount / 100.0); _liveStatesService.LiveStates.LyricsWindowStatus.LyricsEffectSettings.OriginalLyricsHighlightAmount / 100.0);
effectLayerDs.DrawImage(foregroundHighlightEffect); effectLayerDs.DrawImage(foregroundHighlightEffect);
} }

View File

@@ -234,7 +234,15 @@ namespace BetterLyrics.WinUI3.ViewModels.LyricsRendererViewModel
} }
else if (message.Sender is LyricsStyleSettings) else if (message.Sender is LyricsStyleSettings)
{ {
if (message.PropertyName == nameof(LyricsStyleSettings.LyricsFontSize)) if (message.PropertyName == nameof(LyricsStyleSettings.PhoneticLyricsFontSize))
{
_isLayoutChanged = true;
}
else if (message.PropertyName == nameof(LyricsStyleSettings.OriginalLyricsFontSize))
{
_isLayoutChanged = true;
}
else if (message.PropertyName == nameof(LyricsStyleSettings.TranslatedLyricsFontSize))
{ {
_isLayoutChanged = true; _isLayoutChanged = true;
} }
@@ -268,7 +276,7 @@ namespace BetterLyrics.WinUI3.ViewModels.LyricsRendererViewModel
{ {
_isLayoutChanged = true; _isLayoutChanged = true;
} }
else if (message.PropertyName == nameof(LyricsEffectSettings.LyricsHighlightScope)) else if (message.PropertyName == nameof(LyricsEffectSettings.OriginalLyricsHighlightScope))
{ {
_isLayoutChanged = true; _isLayoutChanged = true;
} }
@@ -372,7 +380,14 @@ namespace BetterLyrics.WinUI3.ViewModels.LyricsRendererViewModel
{ {
if (message.Sender is LyricsStyleSettings) if (message.Sender is LyricsStyleSettings)
{ {
if (message.PropertyName == nameof(LyricsStyleSettings.LyricsFontFamily)) if (message.PropertyName == nameof(LyricsStyleSettings.LyricsCJKFontFamily))
{
_isLayoutChanged = true;
}
}
if (message.Sender is LyricsStyleSettings)
{
if (message.PropertyName == nameof(LyricsStyleSettings.LyricsWesternFontFamily))
{ {
_isLayoutChanged = true; _isLayoutChanged = true;
} }

View File

@@ -2,6 +2,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;
using CommunityToolkit.WinUI; using CommunityToolkit.WinUI;
using Microsoft.Graphics.Canvas; using Microsoft.Graphics.Canvas;
using Microsoft.Graphics.Canvas.Effects; using Microsoft.Graphics.Canvas.Effects;
@@ -444,6 +445,13 @@ namespace BetterLyrics.WinUI3.ViewModels.LyricsRendererViewModel
_canvasYScrollTransition.Update(_elapsedTime); _canvasYScrollTransition.Update(_elapsedTime);
} }
private string AutoSelectFontFamily(string text)
{
return LanguageHelper.IsCJK(text)
? _liveStatesService.LiveStates.LyricsWindowStatus.LyricsStyleSettings.LyricsCJKFontFamily
: _liveStatesService.LiveStates.LyricsWindowStatus.LyricsStyleSettings.LyricsWesternFontFamily;
}
private void ReLayout(ICanvasAnimatedControl control) private void ReLayout(ICanvasAnimatedControl control)
{ {
if (control == null) if (control == null)
@@ -451,14 +459,23 @@ namespace BetterLyrics.WinUI3.ViewModels.LyricsRendererViewModel
if (_liveStatesService.LiveStates.LyricsWindowStatus.LyricsStyleSettings.IsDynamicLyricsFontSize) if (_liveStatesService.LiveStates.LyricsWindowStatus.LyricsStyleSettings.IsDynamicLyricsFontSize)
{ {
_lyricsTextFormat.FontSize = (float)Math.Clamp(Math.Min(_canvasHeight, _canvasWidth) / 15, 12, 96); _originalLyricsFontSize = (int)Math.Clamp(Math.Min(_canvasHeight, _canvasWidth) / 15, 12, 96);
_translatedLyricsFontSize = _phoneticLyricsFontSize = (int)(_originalLyricsFontSize * 0.6);
} }
else else
{ {
_lyricsTextFormat.FontSize = _liveStatesService.LiveStates.LyricsWindowStatus.LyricsStyleSettings.LyricsFontSize; _phoneticLyricsFontSize = _liveStatesService.LiveStates.LyricsWindowStatus.LyricsStyleSettings.PhoneticLyricsFontSize;
_originalLyricsFontSize = _liveStatesService.LiveStates.LyricsWindowStatus.LyricsStyleSettings.OriginalLyricsFontSize;
_translatedLyricsFontSize = _liveStatesService.LiveStates.LyricsWindowStatus.LyricsStyleSettings.TranslatedLyricsFontSize;
}
_originalLyricsFontWeight = _liveStatesService.LiveStates.LyricsWindowStatus.LyricsStyleSettings.LyricsFontWeight;
if (SongInfo != null)
{
_titleTextFormat.FontFamily = AutoSelectFontFamily(SongInfo.Title);
_artistTextFormat.FontFamily = AutoSelectFontFamily(SongInfo.Artist);
} }
_lyricsTextFormat.FontWeight = _liveStatesService.LiveStates.LyricsWindowStatus.LyricsStyleSettings.LyricsFontWeight.ToFontWeight();
_lyricsTextFormat.FontFamily = _artistTextFormat.FontFamily = _titleTextFormat.FontFamily = _liveStatesService.LiveStates.LyricsWindowStatus.LyricsStyleSettings.LyricsFontFamily;
_canvasYScrollTransition.SetDuration(_liveStatesService.LiveStates.LyricsWindowStatus.LyricsEffectSettings.LyricsScrollDuration / 1000.0); _canvasYScrollTransition.SetDuration(_liveStatesService.LiveStates.LyricsWindowStatus.LyricsEffectSettings.LyricsScrollDuration / 1000.0);
_canvasYScrollTransition.SetEasingType(_liveStatesService.LiveStates.LyricsWindowStatus.LyricsEffectSettings.LyricsScrollEasingType); _canvasYScrollTransition.SetEasingType(_liveStatesService.LiveStates.LyricsWindowStatus.LyricsEffectSettings.LyricsScrollEasingType);
@@ -475,16 +492,70 @@ namespace BetterLyrics.WinUI3.ViewModels.LyricsRendererViewModel
continue; continue;
} }
line.Position = new Vector2(0, (float)y); line.RecreateTextLayout(control,
line.RecreateTextLayout(control, _lyricsTextFormat, _maxLyricsWidth, _canvasHeight, _liveStatesService.LiveStates.LyricsWindowStatus.LyricsStyleSettings.LyricsAlignmentType); _settingsService.AppSettings.TranslationSettings.IsChineseRomanizationEnabled || _settingsService.AppSettings.TranslationSettings.IsJapaneseRomanizationEnabled,
line.UpdateCenterPosition(_maxLyricsWidth, _liveStatesService.LiveStates.LyricsWindowStatus.LyricsStyleSettings.LyricsAlignmentType); _settingsService.AppSettings.TranslationSettings.IsTranslationEnabled,
_phoneticLyricsFontSize, _originalLyricsFontSize, _translatedLyricsFontSize,
_originalLyricsFontWeight,
_liveStatesService.LiveStates.LyricsWindowStatus.LyricsStyleSettings.LyricsCJKFontFamily, _liveStatesService.LiveStates.LyricsWindowStatus.LyricsStyleSettings.LyricsWesternFontFamily,
_maxLyricsWidth, _canvasHeight, _liveStatesService.LiveStates.LyricsWindowStatus.LyricsStyleSettings.LyricsAlignmentType);
line.RecreateTextGeometry(); line.RecreateTextGeometry();
y += // 设定注音文本布局坐标
(double)line.CanvasTextLayout!.LayoutBounds.Height line.PhoneticPosition = new Vector2(0, (float)y);
/ line.CanvasTextLayout.LineCount
* (line.CanvasTextLayout.LineCount + _liveStatesService.LiveStates.LyricsWindowStatus.LyricsStyleSettings.LyricsLineSpacingFactor); // Y += 注音文本布局高度
if (line.PhoneticCanvasTextLayout != null)
{
y += line.PhoneticCanvasTextLayout.LayoutBounds.Height;
}
// Y += 自定义 倍注音文本行高
if (line.PhoneticCanvasTextLayout != null)
{
y +=
(double)line.PhoneticCanvasTextLayout.LayoutBounds.Height
/ line.PhoneticCanvasTextLayout.LineCount
* 0.1;
}
// 设定原文文本布局坐标
line.OriginalPosition = new Vector2(0, (float)y);
// Y += 原文文本布局高度
if (line.OriginalCanvasTextLayout != null)
{
y += (double)line.OriginalCanvasTextLayout.LayoutBounds.Height;
}
if (line.TranslatedCanvasTextLayout != null)
{
// Y += 自定义 倍翻译文本行高
y +=
(double)line.TranslatedCanvasTextLayout.LayoutBounds.Height
/ line.TranslatedCanvasTextLayout.LineCount
* 0.1;
}
// 设定翻译文本布局坐标
line.TranslatedPosition = new Vector2(0, (float)y);
// Y += 翻译文本布局高度
if (line.TranslatedCanvasTextLayout != null)
{
y += line.TranslatedCanvasTextLayout.LayoutBounds.Height;
}
// Y += 用户自定义倍数原文文本布局高度
if (line.OriginalCanvasTextLayout != null)
{
y += (double)line.OriginalCanvasTextLayout.LayoutBounds.Height
/ line.OriginalCanvasTextLayout.LineCount
* _liveStatesService.LiveStates.LyricsWindowStatus.LyricsStyleSettings.LyricsLineSpacingFactor;
}
line.UpdateCenterPosition(_maxLyricsWidth, _liveStatesService.LiveStates.LyricsWindowStatus.LyricsStyleSettings.LyricsAlignmentType);
} }
} }
@@ -500,11 +571,15 @@ namespace BetterLyrics.WinUI3.ViewModels.LyricsRendererViewModel
if (currentPlayingLine == null) return; if (currentPlayingLine == null) return;
var playingTextLayout = currentPlayingLine?.CanvasTextLayout; var playingTextLayout = currentPlayingLine?.OriginalCanvasTextLayout;
if (playingTextLayout == null) return; if (playingTextLayout == null) return;
double? targetYScrollOffset = -currentPlayingLine!.Position.Y + _currentLyricsData?.LyricsLines[0].Position.Y - playingTextLayout.LayoutBounds.Height / 2.0; //double? targetYScrollOffset = -currentPlayingLine!.OriginalPosition.Y + _currentLyricsData?.LyricsLines[0].OriginalPosition.Y - playingTextLayout.LayoutBounds.Height / 2.0;
double? targetYScrollOffset =
-currentPlayingLine!.OriginalPosition.Y
+ _currentLyricsData?.LyricsLines[0].OriginalPosition.Y
- (currentPlayingLine.TranslatedPosition.Y + (currentPlayingLine.TranslatedCanvasTextLayout?.LayoutBounds.Height ?? 0) - currentPlayingLine.PhoneticPosition.Y) / 2.0;
if (!targetYScrollOffset.HasValue) return; if (!targetYScrollOffset.HasValue) return;
@@ -540,9 +615,9 @@ namespace BetterLyrics.WinUI3.ViewModels.LyricsRendererViewModel
{ {
int mid = (left + right) / 2; int mid = (left + right) / 2;
var line = lines[mid]; var line = lines[mid];
var layout = line.CanvasTextLayout; var layout = line.OriginalCanvasTextLayout;
if (layout == null) break; if (layout == null) break;
double value = offset + line.Position.Y + (double)layout.LayoutBounds.Height; double value = offset + line.OriginalPosition.Y + (double)layout.LayoutBounds.Height;
if (value >= 0) if (value >= 0)
{ {
result = mid; result = mid;
@@ -563,9 +638,9 @@ namespace BetterLyrics.WinUI3.ViewModels.LyricsRendererViewModel
{ {
int mid = (left + right) / 2; int mid = (left + right) / 2;
var line = lines[mid]; var line = lines[mid];
var layout = line.CanvasTextLayout; var layout = line.OriginalCanvasTextLayout;
if (layout == null) break; if (layout == null) break;
double value = offset + line.Position.Y + (double)layout.LayoutBounds.Height; double value = offset + line.OriginalPosition.Y + (double)layout.LayoutBounds.Height;
if (value >= canvasHeight) if (value >= canvasHeight)
{ {
result = mid; result = mid;
@@ -703,7 +778,7 @@ namespace BetterLyrics.WinUI3.ViewModels.LyricsRendererViewModel
{ {
int lineCountDelta = i - _playingLineIndex; int lineCountDelta = i - _playingLineIndex;
int absoluteLineCountDelta = Math.Abs(lineCountDelta); int absoluteLineCountDelta = Math.Abs(lineCountDelta);
double distanceFromPlayingLine = Math.Abs(line.Position.Y - currentPlayingLine.Position.Y); double distanceFromPlayingLine = Math.Abs(line.OriginalPosition.Y - currentPlayingLine.OriginalPosition.Y);
double distanceFactor = Math.Clamp(distanceFromPlayingLine / (_canvasHeight / 2), 0, 1); double distanceFactor = Math.Clamp(distanceFromPlayingLine / (_canvasHeight / 2), 0, 1);
line.AngleTransition.StartTransition(_liveStatesService.LiveStates.LyricsWindowStatus.LyricsEffectSettings.IsFanLyricsEnabled line.AngleTransition.StartTransition(_liveStatesService.LiveStates.LyricsWindowStatus.LyricsEffectSettings.IsFanLyricsEnabled

View File

@@ -134,12 +134,12 @@ namespace BetterLyrics.WinUI3.ViewModels.LyricsRendererViewModel
private int _timelineSyncThreshold = 0; private int _timelineSyncThreshold = 0;
private CanvasTextFormat _lyricsTextFormat = new() private int _phoneticLyricsFontSize = 18;
{ private int _originalLyricsFontSize = 36;
HorizontalAlignment = CanvasHorizontalAlignment.Left, private int _translatedLyricsFontSize = 18;
VerticalAlignment = CanvasVerticalAlignment.Top,
FontSize = 12, private LyricsFontWeight _originalLyricsFontWeight = LyricsFontWeight.Bold;
};
private CanvasTextFormat _titleTextFormat = new() private CanvasTextFormat _titleTextFormat = new()
{ {
FontSize = 18, FontSize = 18,

View File

@@ -33,8 +33,8 @@
<TextBlock <TextBlock
x:Uid="MainPageNoMusicPlaying" x:Uid="MainPageNoMusicPlaying"
HorizontalAlignment="Center" HorizontalAlignment="Center"
FontFamily="{x:Bind ViewModel.LiveStates.LyricsWindowStatus.LyricsStyleSettings.LyricsFontFamily, Mode=OneWay}" FontFamily="{x:Bind ViewModel.LiveStates.LyricsWindowStatus.LyricsStyleSettings.LyricsCJKFontFamily, Mode=OneWay}"
FontSize="{x:Bind ViewModel.LiveStates.LyricsWindowStatus.LyricsStyleSettings.LyricsFontSize, Mode=OneWay}" FontSize="{x:Bind ViewModel.LiveStates.LyricsWindowStatus.LyricsStyleSettings.OriginalLyricsFontSize, Mode=OneWay}"
TextWrapping="Wrap" /> TextWrapping="Wrap" />
<StackPanel HorizontalAlignment="Center" Orientation="Horizontal"> <StackPanel HorizontalAlignment="Center" Orientation="Horizontal">
<HyperlinkButton x:Uid="SettingsPageFAQ" NavigateUri="{x:Bind const:Link.FAQUrl}" /> <HyperlinkButton x:Uid="SettingsPageFAQ" NavigateUri="{x:Bind const:Link.FAQUrl}" />
@@ -321,7 +321,8 @@
Margin="0,0,0,2" Margin="0,0,0,2"
Foreground="{ThemeResource TextFillColorSecondaryBrush}" Foreground="{ThemeResource TextFillColorSecondaryBrush}"
Text="{x:Bind ViewModel.TimelineSliderThumbLyricsLine.StartMs, Converter={StaticResource MillisecondsToFormattedTimeConverter}, Mode=OneWay}" /> Text="{x:Bind ViewModel.TimelineSliderThumbLyricsLine.StartMs, Converter={StaticResource MillisecondsToFormattedTimeConverter}, Mode=OneWay}" />
<TextBlock Margin="0,0,0,2" Text="{x:Bind ViewModel.TimelineSliderThumbLyricsLine.DisplayedText, Mode=OneWay}" /> <!-- TODO 原文翻译共同显示 -->
<TextBlock Margin="0,0,0,2" Text="{x:Bind ViewModel.TimelineSliderThumbLyricsLine.OriginalText, Mode=OneWay}" />
</StackPanel> </StackPanel>
</Grid> </Grid>
<Grid <Grid