chores: plug-in system has been initially completed.

This commit is contained in:
Zhe Fang
2026-01-11 18:58:18 -05:00
parent 2cac55b55e
commit a82f1bdb53
41 changed files with 1139 additions and 771 deletions

15
.idea/.idea.BetterLyrics/.idea/.gitignore generated vendored Normal file
View File

@@ -0,0 +1,15 @@
# Default ignored files
/shelf/
/workspace.xml
# Rider ignored files
/contentModel.xml
/.idea.BetterLyrics.iml
/modules.xml
/projectSettingsUpdater.xml
# Ignored default folder with query files
/queries/
# Datasource local storage ignored files
/dataSources/
/dataSources.local.xml
# Editor-based HTTP Client requests
/httpRequests/

View File

@@ -0,0 +1,4 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="Encoding" addBOMForNewFiles="with BOM under Windows, with no BOM otherwise" />
</project>

View File

@@ -0,0 +1,8 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="UserContentModel">
<attachedFolders />
<explicitIncludes />
<explicitExcludes />
</component>
</project>

6
.idea/.idea.BetterLyrics/.idea/vcs.xml generated Normal file
View File

@@ -0,0 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="VcsDirectoryMappings">
<mapping directory="" vcs="Git" />
</component>
</project>

View File

@@ -1,13 +0,0 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>net10.0-windows10.0.26100.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
</PropertyGroup>
<ItemGroup>
<ProjectReference Include="..\BetterLyrics.Core\BetterLyrics.Core.csproj" />
</ItemGroup>
</Project>

View File

@@ -1,63 +0,0 @@
using BetterLyrics.Core.Interfaces;
using BetterLyrics.Core.Models;
namespace BetterLyrics.Plugins.Demo
{
public class DemoLyricsProvider : ILyricsSearchPlugin
{
public string Id => "f7acc86b-6e3d-42c3-a9a9-8c05c5339412";
public string Name => "Plugin name";
public string Author => "jayfunc";
public string Description => "Plugin description";
public void Initialize() { }
public async Task<LyricsSearchResult> GetLyricsAsync(string title, string artist, string album, double duration)
{
await Task.Delay(300);
string searchedTitle = "Demo Song";
string searchedArtist = "Demo Artist";
string searchedAlbum = "Demo Album";
double searchedDuration = 25.0;
string searchedRaw =
$"[00:00.00]Welcome to use Demo Plugin\n" +
$"[00:05.00]Playing: {title} now\n" +
$"[00:10.00]Artist: {artist}\n" +
$"[00:15.00]Album: {album}\n" +
$"[00:20.00]Duration: {duration}\n" +
$"[00:25.00]This is a test lyrics source...";
string searchedTranslation =
$"[00:00.00]欢迎使用演示插件\n" +
$"[00:05.00]当前正在播放:{title}\n" +
$"[00:10.00]歌手:{artist}\n" +
$"[00:15.00]专辑:{album}\n" +
$"[00:20.00]时长:{duration}\n" +
$"[00:25.00]这是一个测试歌词源...";
string searchedTransliteration =
$"[00:00.00]ˈwɛlkəm tuː juːz ˈdɛmoʊ ˈplʌgɪn\n" +
$"[00:05.00]ˈpleɪɪŋ: {title} naʊ\n" +
$"[00:10.00]ˈɑːrtɪst: {artist}\n" +
$"[00:15.00]ˈælbəm: {album}\n" +
$"[00:20.00]dʊˈreɪʃən: {duration}\n" +
$"[00:25.00]ðɪs ɪz ə tɛst ˈlɪrɪks sɔːrs...";
string searchedReference = "https://path.to.lyrics/if.the.lyrics.was.originally.fetched.from.web";
return new LyricsSearchResult(
searchedTitle,
searchedArtist,
searchedAlbum,
searchedDuration,
searchedRaw,
searchedTranslation,
searchedTransliteration,
searchedReference);
}
}
}

View File

@@ -6,7 +6,6 @@
<Nullable>enable</Nullable> <Nullable>enable</Nullable>
<SupportedOSPlatformVersion>10.0.19041.0</SupportedOSPlatformVersion> <SupportedOSPlatformVersion>10.0.19041.0</SupportedOSPlatformVersion>
<RuntimeIdentifiers>win-x86;win-x64;win-arm64</RuntimeIdentifiers> <RuntimeIdentifiers>win-x86;win-x64;win-arm64</RuntimeIdentifiers>
<UseWinUI>true</UseWinUI>
<EnableDynamicLoading>true</EnableDynamicLoading> <EnableDynamicLoading>true</EnableDynamicLoading>
</PropertyGroup> </PropertyGroup>
@@ -98,11 +97,39 @@
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<ProjectReference Include="..\BetterLyrics.Core\BetterLyrics.Core.csproj" > <ProjectReference Include="..\BetterLyrics.Core\BetterLyrics.Core.csproj" />
<Private>false</Private>
<ExcludeAssets>runtime</ExcludeAssets>
</ProjectReference>
<ProjectReference Include="..\RomajiConverter.Core\RomajiConverter.Core.csproj" /> <ProjectReference Include="..\RomajiConverter.Core\RomajiConverter.Core.csproj" />
</ItemGroup> </ItemGroup>
<Target Name="AutoExcludeSharedAssemblies" AfterTargets="ResolveAssemblyReferences">
<PropertyGroup>
<HostOutputDir>..\BetterLyrics.WinUI3\BetterLyrics.WinUI3\bin\x64\$(Configuration)\$(TargetFramework)\</HostOutputDir>
</PropertyGroup>
<Message Text="[Debug] Searching for Host Assemblies in: $(HostOutputDir)" Importance="High" />
<ItemGroup>
<FilesToCopy Include="@(ReferenceCopyLocalPaths)" />
<SharedFiles Include="@(FilesToCopy)"
Condition="Exists('$(HostOutputDir)%(Filename)%(Extension)')" />
<ReferenceCopyLocalPaths Remove="@(SharedFiles)" />
</ItemGroup>
<Message Text="[Smart Trim] Excluded shared assemblies:%0a@(SharedFiles->' -> %(Filename)%(Extension)', '%0a')" Importance="High" Condition="'@(SharedFiles)' != ''" />
</Target>
<Target Name="RunPluginAnalyzer" AfterTargets="Build">
<PropertyGroup>
<AnalyzerPath>..\PluginAnalyzer\bin\Debug\net10.0\PluginAnalyzer.exe</AnalyzerPath>
<ScanDir>$(TargetDir)</ScanDir>
<Ns>BetterLyrics.WinUI3</Ns>
<Prefix>$(ProjectName)</Prefix>
<OutputDir>..\BetterLyrics.WinUI3\BetterLyrics.WinUI3\PluginConfigs\</OutputDir>
</PropertyGroup>
<Message Text="[Analyzer] Delivering configs to Main App..." Importance="High" />
<Exec Command="&quot;$(AnalyzerPath)&quot; &quot;$(ScanDir)\&quot; &quot;$(Ns)&quot; &quot;$(Prefix)&quot; &quot;$(OutputDir)\&quot;" />
</Target>
</Project> </Project>

View File

@@ -143,7 +143,7 @@
</ProjectReference> </ProjectReference>
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<PackageReference Include="Microsoft.Windows.SDK.BuildTools" Version="10.0.26100.7175" /> <PackageReference Include="Microsoft.Windows.SDK.BuildTools" Version="10.0.26100.7463" />
<PackageReference Include="Microsoft.WindowsAppSDK" Version="1.8.251106002" /> <PackageReference Include="Microsoft.WindowsAppSDK" Version="1.8.251106002" />
</ItemGroup> </ItemGroup>
<Import Project="$(WapProjPath)\Microsoft.DesktopBridge.targets" /> <Import Project="$(WapProjPath)\Microsoft.DesktopBridge.targets" />

View File

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

View File

@@ -23,7 +23,7 @@ using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Logging; using Microsoft.Extensions.Logging;
using Microsoft.UI.Xaml; using Microsoft.UI.Xaml;
using Microsoft.Windows.AppLifecycle; // 关键App生命周期管理 using Microsoft.Windows.AppLifecycle;
using Serilog; using Serilog;
using System; using System;
using System.Linq; using System.Linq;

View File

@@ -83,7 +83,7 @@
<PackageReference Include="CommunityToolkit.WinUI.Triggers" Version="8.2.251219" /> <PackageReference Include="CommunityToolkit.WinUI.Triggers" Version="8.2.251219" />
<PackageReference Include="ComputeSharp.D2D1.WinUI" Version="3.2.0" /> <PackageReference Include="ComputeSharp.D2D1.WinUI" Version="3.2.0" />
<PackageReference Include="csharp-pinyin" Version="1.0.1" /> <PackageReference Include="csharp-pinyin" Version="1.0.1" />
<PackageReference Include="DevWinUI.Controls" Version="9.8.1" /> <PackageReference Include="DevWinUI.Controls" Version="9.9.2" />
<PackageReference Include="Dubya.WindowsMediaController" Version="2.5.6" /> <PackageReference Include="Dubya.WindowsMediaController" Version="2.5.6" />
<PackageReference Include="F23.StringSimilarity" Version="7.0.1" /> <PackageReference Include="F23.StringSimilarity" Version="7.0.1" />
<PackageReference Include="FlaUI.UIA3" Version="5.0.0" /> <PackageReference Include="FlaUI.UIA3" Version="5.0.0" />
@@ -98,13 +98,13 @@
<PackageReference Include="Microsoft.EntityFrameworkCore.Relational" Version="10.0.1" /> <PackageReference Include="Microsoft.EntityFrameworkCore.Relational" Version="10.0.1" />
<PackageReference Include="Microsoft.EntityFrameworkCore.Sqlite" Version="10.0.1" /> <PackageReference Include="Microsoft.EntityFrameworkCore.Sqlite" Version="10.0.1" />
<PackageReference Include="Microsoft.EntityFrameworkCore.Tools" Version="10.0.1"> <PackageReference Include="Microsoft.EntityFrameworkCore.Tools" Version="10.0.1">
<PrivateAssets>all</PrivateAssets> <PrivateAssets>all</PrivateAssets>
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets> <IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
</PackageReference> </PackageReference>
<PackageReference Include="Microsoft.Extensions.DependencyInjection" Version="10.0.1" /> <PackageReference Include="Microsoft.Extensions.DependencyInjection" Version="10.0.1" />
<PackageReference Include="Microsoft.Extensions.Logging" Version="10.0.1" /> <PackageReference Include="Microsoft.Extensions.Logging" Version="10.0.1" />
<PackageReference Include="Microsoft.Graphics.Win2D" Version="1.3.2" /> <PackageReference Include="Microsoft.Graphics.Win2D" Version="1.3.2" />
<PackageReference Include="Microsoft.Windows.SDK.BuildTools" Version="10.0.26100.7175" /> <PackageReference Include="Microsoft.Windows.SDK.BuildTools" Version="10.0.26100.7463" />
<PackageReference Include="Microsoft.WindowsAppSDK" Version="1.8.251106002" /> <PackageReference Include="Microsoft.WindowsAppSDK" Version="1.8.251106002" />
<PackageReference Include="NAudio.Wasapi" Version="2.2.1" /> <PackageReference Include="NAudio.Wasapi" Version="2.2.1" />
<PackageReference Include="NTextCat" Version="0.3.65" /> <PackageReference Include="NTextCat" Version="0.3.65" />
@@ -123,12 +123,12 @@
<PackageReference Include="VCollab.DiscordRichPresence" Version="1.7.0" /> <PackageReference Include="VCollab.DiscordRichPresence" Version="1.7.0" />
<PackageReference Include="WebDav.Client" Version="2.9.0" /> <PackageReference Include="WebDav.Client" Version="2.9.0" />
<PackageReference Include="WinUIEx" Version="2.9.0" /> <PackageReference Include="WinUIEx" Version="2.9.0" />
<PackageReference Include="z440.atl.core" Version="7.9.0" /> <PackageReference Include="z440.atl.core" Version="7.10.0" />
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<ProjectReference Include="..\..\BetterLyrics.Core\BetterLyrics.Core.csproj" /> <ProjectReference Include="..\..\BetterLyrics.Core\BetterLyrics.Core.csproj" />
<ProjectReference Include="..\..\ColorThief.WinUI3\ColorThief.WinUI3.csproj" /> <ProjectReference Include="..\..\ColorThief.WinUI3\ColorThief.WinUI3.csproj" />
<ProjectReference Include="..\..\Impressionist\Impressionist\Impressionist.csproj" /> <ProjectReference Include="..\..\Impressionist\Impressionist\Impressionist.csproj" />
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<Page Update="Rendering\InAppLyricsRenderer.xaml"> <Page Update="Rendering\InAppLyricsRenderer.xaml">
@@ -140,257 +140,245 @@
<Generator>MSBuild:Compile</Generator> <Generator>MSBuild:Compile</Generator>
</Page> </Page>
</ItemGroup> </ItemGroup>
<!--Disable Trimming for Specific Packages-->
<ItemGroup> <ItemGroup>
<TrimmerRootAssembly Include="FlaUI.UIA3" /> <TrimmerRootDescriptor Include="PluginConfigs\**\*_TrimmerRoots.xml" />
<TrimmerRootAssembly Include="Interop.UIAutomationClient" /> <TrimmerRootDescriptor Include="Core_TrimmerRoots.xml" />
<TrimmerRootAssembly Include="Microsoft.EntityFrameworkCore" />
<TrimmerRootAssembly Include="Microsoft.EntityFrameworkCore.Abstractions" />
<TrimmerRootAssembly Include="Microsoft.EntityFrameworkCore.Relational" />
<TrimmerRootAssembly Include="Microsoft.EntityFrameworkCore.Sqlite" />
<TrimmerRootAssembly Include="NAudio.Wasapi" />
<TrimmerRootAssembly Include="TagLibSharp" />
<TrimmerRootAssembly Include="Vanara.PInvoke.DwmApi" />
<TrimmerRootAssembly Include="Vanara.PInvoke.Gdi32" />
<TrimmerRootAssembly Include="Vanara.PInvoke.Shell32" />
<TrimmerRootAssembly Include="Vanara.PInvoke.User32" />
<TrimmerRootAssembly Include="Vanara.Windows.Shell" />
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<Content Update="Assets\AIMP.png"> <Content Update="Assets\AIMP.png">
<CopyToOutputDirectory>Always</CopyToOutputDirectory> <CopyToOutputDirectory>Always</CopyToOutputDirectory>
</Content> </Content>
<Content Update="Assets\AlbumArtPlaceholder.png"> <Content Update="Assets\AlbumArtPlaceholder.png">
<CopyToOutputDirectory>Always</CopyToOutputDirectory> <CopyToOutputDirectory>Always</CopyToOutputDirectory>
</Content> </Content>
<Content Update="Assets\Alipay.jpg"> <Content Update="Assets\Alipay.jpg">
<CopyToOutputDirectory>Always</CopyToOutputDirectory> <CopyToOutputDirectory>Always</CopyToOutputDirectory>
</Content> </Content>
<Content Update="Assets\AMLLPlayer.png"> <Content Update="Assets\AMLLPlayer.png">
<CopyToOutputDirectory>Always</CopyToOutputDirectory> <CopyToOutputDirectory>Always</CopyToOutputDirectory>
</Content> </Content>
<Content Update="Assets\AppleMusic.png"> <Content Update="Assets\AppleMusic.png">
<CopyToOutputDirectory>Always</CopyToOutputDirectory> <CopyToOutputDirectory>Always</CopyToOutputDirectory>
</Content> </Content>
<Content Update="Assets\Chrome.png"> <Content Update="Assets\Chrome.png">
<CopyToOutputDirectory>Always</CopyToOutputDirectory> <CopyToOutputDirectory>Always</CopyToOutputDirectory>
</Content> </Content>
<Content Update="Assets\Edge.png"> <Content Update="Assets\Edge.png">
<CopyToOutputDirectory>Always</CopyToOutputDirectory> <CopyToOutputDirectory>Always</CopyToOutputDirectory>
</Content> </Content>
<Content Update="Assets\FluidEffect.bin"> <Content Update="Assets\FluidEffect.bin">
<CopyToOutputDirectory>Always</CopyToOutputDirectory> <CopyToOutputDirectory>Always</CopyToOutputDirectory>
</Content> </Content>
<Content Update="Assets\Empty.png"> <Content Update="Assets\Empty.png">
<CopyToOutputDirectory>Always</CopyToOutputDirectory> <CopyToOutputDirectory>Always</CopyToOutputDirectory>
</Content> </Content>
<Content Update="Assets\EmptyBox.png"> <Content Update="Assets\EmptyBox.png">
<CopyToOutputDirectory>Always</CopyToOutputDirectory> <CopyToOutputDirectory>Always</CopyToOutputDirectory>
</Content> </Content>
<Content Update="Assets\EmptyState.png"> <Content Update="Assets\EmptyState.png">
<CopyToOutputDirectory>Always</CopyToOutputDirectory> <CopyToOutputDirectory>Always</CopyToOutputDirectory>
</Content> </Content>
<Content Update="Assets\Folder.png"> <Content Update="Assets\Folder.png">
<CopyToOutputDirectory>Always</CopyToOutputDirectory> <CopyToOutputDirectory>Always</CopyToOutputDirectory>
</Content> </Content>
<Content Update="Assets\foobar2000.png"> <Content Update="Assets\foobar2000.png">
<CopyToOutputDirectory>Always</CopyToOutputDirectory> <CopyToOutputDirectory>Always</CopyToOutputDirectory>
</Content> </Content>
<Content Update="Assets\HyPlayer.png"> <Content Update="Assets\HyPlayer.png">
<CopyToOutputDirectory>Always</CopyToOutputDirectory> <CopyToOutputDirectory>Always</CopyToOutputDirectory>
</Content> </Content>
<Content Update="Assets\iTunes.png"> <Content Update="Assets\iTunes.png">
<CopyToOutputDirectory>Always</CopyToOutputDirectory> <CopyToOutputDirectory>Always</CopyToOutputDirectory>
</Content> </Content>
<Content Update="Assets\KugouMusic.png"> <Content Update="Assets\KugouMusic.png">
<CopyToOutputDirectory>Always</CopyToOutputDirectory> <CopyToOutputDirectory>Always</CopyToOutputDirectory>
</Content> </Content>
<Content Update="Assets\LastFM.png"> <Content Update="Assets\LastFM.png">
<CopyToOutputDirectory>Always</CopyToOutputDirectory> <CopyToOutputDirectory>Always</CopyToOutputDirectory>
</Content> </Content>
<Content Update="Assets\Leaf.png"> <Content Update="Assets\Leaf.png">
<CopyToOutputDirectory>Always</CopyToOutputDirectory> <CopyToOutputDirectory>Always</CopyToOutputDirectory>
</Content> </Content>
<Content Update="Assets\Listen1.png"> <Content Update="Assets\Listen1.png">
<CopyToOutputDirectory>Always</CopyToOutputDirectory> <CopyToOutputDirectory>Always</CopyToOutputDirectory>
</Content> </Content>
<Content Update="Assets\Logo.ico"> <Content Update="Assets\Logo.ico">
<CopyToOutputDirectory>Always</CopyToOutputDirectory> <CopyToOutputDirectory>Always</CopyToOutputDirectory>
</Content> </Content>
<Content Update="Assets\Logo.png"> <Content Update="Assets\Logo.png">
<CopyToOutputDirectory>Always</CopyToOutputDirectory> <CopyToOutputDirectory>Always</CopyToOutputDirectory>
</Content> </Content>
<Content Update="Assets\LXMusic.png"> <Content Update="Assets\LXMusic.png">
<CopyToOutputDirectory>Always</CopyToOutputDirectory> <CopyToOutputDirectory>Always</CopyToOutputDirectory>
</Content> </Content>
<Content Update="Assets\MediaPlayerWindows11.png"> <Content Update="Assets\MediaPlayerWindows11.png">
<CopyToOutputDirectory>Always</CopyToOutputDirectory> <CopyToOutputDirectory>Always</CopyToOutputDirectory>
</Content> </Content>
<Content Update="Assets\MoeKoeMusic.png"> <Content Update="Assets\MoeKoeMusic.png">
<CopyToOutputDirectory>Always</CopyToOutputDirectory> <CopyToOutputDirectory>Always</CopyToOutputDirectory>
</Content> </Content>
<Content Update="Assets\MusicBee.png"> <Content Update="Assets\MusicBee.png">
<CopyToOutputDirectory>Always</CopyToOutputDirectory> <CopyToOutputDirectory>Always</CopyToOutputDirectory>
</Content> </Content>
<Content Update="Assets\NetEaseCloudMusic.png"> <Content Update="Assets\NetEaseCloudMusic.png">
<CopyToOutputDirectory>Always</CopyToOutputDirectory> <CopyToOutputDirectory>Always</CopyToOutputDirectory>
</Content> </Content>
<Content Update="Assets\OriginalSoundHQPlayer.png"> <Content Update="Assets\OriginalSoundHQPlayer.png">
<CopyToOutputDirectory>Always</CopyToOutputDirectory> <CopyToOutputDirectory>Always</CopyToOutputDirectory>
</Content> </Content>
<Content Update="Assets\Page.png"> <Content Update="Assets\Page.png">
<CopyToOutputDirectory>Always</CopyToOutputDirectory> <CopyToOutputDirectory>Always</CopyToOutputDirectory>
</Content> </Content>
<Content Update="Assets\PlanetMusic.png"> <Content Update="Assets\PlanetMusic.png">
<CopyToOutputDirectory>Always</CopyToOutputDirectory> <CopyToOutputDirectory>Always</CopyToOutputDirectory>
</Content> </Content>
<Content Update="Assets\PotPlayer.png"> <Content Update="Assets\PotPlayer.png">
<CopyToOutputDirectory>Always</CopyToOutputDirectory> <CopyToOutputDirectory>Always</CopyToOutputDirectory>
</Content> </Content>
<Content Update="Assets\QQMusic.png"> <Content Update="Assets\QQMusic.png">
<CopyToOutputDirectory>Always</CopyToOutputDirectory> <CopyToOutputDirectory>Always</CopyToOutputDirectory>
</Content> </Content>
<Content Update="Assets\Question.png"> <Content Update="Assets\Question.png">
<CopyToOutputDirectory>Always</CopyToOutputDirectory> <CopyToOutputDirectory>Always</CopyToOutputDirectory>
</Content> </Content>
<Content Update="Assets\RevolvingHearts.gif"> <Content Update="Assets\RevolvingHearts.gif">
<CopyToOutputDirectory>Always</CopyToOutputDirectory> <CopyToOutputDirectory>Always</CopyToOutputDirectory>
</Content> </Content>
<Content Update="Assets\SaltPlayerForWindows.png"> <Content Update="Assets\SaltPlayerForWindows.png">
<CopyToOutputDirectory>Always</CopyToOutputDirectory> <CopyToOutputDirectory>Always</CopyToOutputDirectory>
</Content> </Content>
<Content Update="Assets\Segoe Fluent Icons.ttf"> <Content Update="Assets\Segoe Fluent Icons.ttf">
<CopyToOutputDirectory>Always</CopyToOutputDirectory> <CopyToOutputDirectory>Always</CopyToOutputDirectory>
</Content> </Content>
<Content Update="Assets\Spotify.png"> <Content Update="Assets\Spotify.png">
<CopyToOutputDirectory>Always</CopyToOutputDirectory> <CopyToOutputDirectory>Always</CopyToOutputDirectory>
</Content> </Content>
<Content Update="Assets\WeChatReward.png"> <Content Update="Assets\WeChatReward.png">
<CopyToOutputDirectory>Always</CopyToOutputDirectory> <CopyToOutputDirectory>Always</CopyToOutputDirectory>
</Content> </Content>
<Content Update="Assets\Wiki82.profile.xml"> <Content Update="Assets\Wiki82.profile.xml">
<CopyToOutputDirectory>Always</CopyToOutputDirectory> <CopyToOutputDirectory>Always</CopyToOutputDirectory>
</Content> </Content>
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<Page Update="Controls\PluginManagerControl.xaml"> <Page Update="Controls\PluginManagerControl.xaml">
<Generator>MSBuild:Compile</Generator> <Generator>MSBuild:Compile</Generator>
</Page> </Page>
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<Page Update="Controls\PatronControl.xaml"> <Page Update="Controls\PatronControl.xaml">
<Generator>MSBuild:Compile</Generator> <Generator>MSBuild:Compile</Generator>
</Page> </Page>
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<Page Update="Styles\GhostSliderStyle.xaml"> <Page Update="Styles\GhostSliderStyle.xaml">
<Generator>MSBuild:Compile</Generator> <Generator>MSBuild:Compile</Generator>
</Page> </Page>
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<Page Update="Styles\Converters.xaml"> <Page Update="Styles\Converters.xaml">
<Generator>MSBuild:Compile</Generator> <Generator>MSBuild:Compile</Generator>
</Page> </Page>
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<Page Update="Controls\PlayQueue.xaml"> <Page Update="Controls\PlayQueue.xaml">
<Generator>MSBuild:Compile</Generator> <Generator>MSBuild:Compile</Generator>
</Page> </Page>
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<Page Update="Controls\StatsDashboardControl.xaml"> <Page Update="Controls\StatsDashboardControl.xaml">
<Generator>MSBuild:Compile</Generator> <Generator>MSBuild:Compile</Generator>
</Page> </Page>
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<Page Update="Controls\FontFamilyAutoSuggestBox.xaml"> <Page Update="Controls\FontFamilyAutoSuggestBox.xaml">
<Generator>MSBuild:Compile</Generator> <Generator>MSBuild:Compile</Generator>
</Page> </Page>
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<Page Update="Controls\LyricsStyleSettingsControl.xaml"> <Page Update="Controls\LyricsStyleSettingsControl.xaml">
<Generator>MSBuild:Compile</Generator> <Generator>MSBuild:Compile</Generator>
</Page> </Page>
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<Page Update="Views\LyricsWindowSwitchWindow.xaml"> <Page Update="Views\LyricsWindowSwitchWindow.xaml">
<Generator>MSBuild:Compile</Generator> <Generator>MSBuild:Compile</Generator>
</Page> </Page>
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<Page Update="Controls\LyricsWindowSwitchControl.xaml"> <Page Update="Controls\LyricsWindowSwitchControl.xaml">
<Generator>MSBuild:Compile</Generator> <Generator>MSBuild:Compile</Generator>
</Page> </Page>
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<Page Update="Controls\DemoWindowGrid.xaml"> <Page Update="Controls\DemoWindowGrid.xaml">
<Generator>MSBuild:Compile</Generator> <Generator>MSBuild:Compile</Generator>
</Page> </Page>
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<Page Update="Controls\LyricsWindowSettingsControl.xaml"> <Page Update="Controls\LyricsWindowSettingsControl.xaml">
<Generator>MSBuild:Compile</Generator> <Generator>MSBuild:Compile</Generator>
</Page> </Page>
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<Page Update="Views\LyricsSearchWindow.xaml"> <Page Update="Views\LyricsSearchWindow.xaml">
<Generator>MSBuild:Compile</Generator> <Generator>MSBuild:Compile</Generator>
</Page> </Page>
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<Page Update="Controls\LyricsSearchControl.xaml"> <Page Update="Controls\LyricsSearchControl.xaml">
<Generator>MSBuild:Compile</Generator> <Generator>MSBuild:Compile</Generator>
</Page> </Page>
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<Page Update="Controls\ShortcutTextBox.xaml"> <Page Update="Controls\ShortcutTextBox.xaml">
<Generator>MSBuild:Compile</Generator> <Generator>MSBuild:Compile</Generator>
</Page> </Page>
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<Page Update="Controls\ExtendedSlider.xaml"> <Page Update="Controls\ExtendedSlider.xaml">
<Generator>MSBuild:Compile</Generator> <Generator>MSBuild:Compile</Generator>
</Page> </Page>
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<Page Update="Controls\LyricsEffectSettingsControl.xaml"> <Page Update="Controls\LyricsEffectSettingsControl.xaml">
<Generator>MSBuild:Compile</Generator> <Generator>MSBuild:Compile</Generator>
</Page> </Page>
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<Page Update="Controls\MediaSettingsControl.xaml"> <Page Update="Controls\MediaSettingsControl.xaml">
<Generator>MSBuild:Compile</Generator> <Generator>MSBuild:Compile</Generator>
</Page> </Page>
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<Page Update="Controls\PlaybackSettingsControl.xaml"> <Page Update="Controls\PlaybackSettingsControl.xaml">
<Generator>MSBuild:Compile</Generator> <Generator>MSBuild:Compile</Generator>
</Page> </Page>
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<Page Update="Controls\AlbumArtAreaStyleSettingsControl.xaml"> <Page Update="Controls\AlbumArtAreaStyleSettingsControl.xaml">
<Generator>MSBuild:Compile</Generator> <Generator>MSBuild:Compile</Generator>
</Page> </Page>
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<Page Update="Controls\LyricsBackgroundSettingsControl.xaml"> <Page Update="Controls\LyricsBackgroundSettingsControl.xaml">
<Generator>MSBuild:Compile</Generator> <Generator>MSBuild:Compile</Generator>
</Page> </Page>
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<Page Update="Controls\AppSettingsControl.xaml"> <Page Update="Controls\AppSettingsControl.xaml">
<Generator>MSBuild:Compile</Generator> <Generator>MSBuild:Compile</Generator>
</Page> </Page>
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<Page Update="Views\MusicGalleryWindow.xaml"> <Page Update="Views\MusicGalleryWindow.xaml">
<Generator>MSBuild:Compile</Generator> <Generator>MSBuild:Compile</Generator>
</Page> </Page>
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<Page Update="Views\MusicGalleryPage.xaml"> <Page Update="Views\MusicGalleryPage.xaml">
<Generator>MSBuild:Compile</Generator> <Generator>MSBuild:Compile</Generator>
</Page> </Page>
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<Page Update="Views\SettingsWindow.xaml"> <Page Update="Views\SettingsWindow.xaml">
@@ -403,54 +391,57 @@
</Page> </Page>
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<Page Update="Controls\RemoteServerConfigControl.xaml"> <Page Update="Controls\RemoteServerConfigControl.xaml">
<Generator>MSBuild:Compile</Generator> <Generator>MSBuild:Compile</Generator>
</Page> </Page>
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<Page Update="Controls\NowPlayingBar.xaml"> <Page Update="Controls\NowPlayingBar.xaml">
<Generator>MSBuild:Compile</Generator> <Generator>MSBuild:Compile</Generator>
</Page> </Page>
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<Page Update="Views\SystemTrayWindow.xaml"> <Page Update="Views\SystemTrayWindow.xaml">
<Generator>MSBuild:Compile</Generator> <Generator>MSBuild:Compile</Generator>
</Page> </Page>
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<Page Update="Controls\WindowSettingsControl.xaml"> <Page Update="Controls\WindowSettingsControl.xaml">
<Generator>MSBuild:Compile</Generator> <Generator>MSBuild:Compile</Generator>
</Page> </Page>
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<Page Update="Controls\AlbumArtAreaEffectSettingsControl.xaml"> <Page Update="Controls\AlbumArtAreaEffectSettingsControl.xaml">
<Generator>MSBuild:Compile</Generator> <Generator>MSBuild:Compile</Generator>
</Page> </Page>
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<Page Update="Controls\ImageSwitcher.xaml"> <Page Update="Controls\ImageSwitcher.xaml">
<Generator>MSBuild:Compile</Generator> <Generator>MSBuild:Compile</Generator>
</Page> </Page>
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<Page Update="Controls\ShadowImage.xaml"> <Page Update="Controls\ShadowImage.xaml">
<Generator>MSBuild:Compile</Generator> <Generator>MSBuild:Compile</Generator>
</Page> </Page>
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<Page Update="Controls\PropertyRow.xaml"> <Page Update="Controls\PropertyRow.xaml">
<Generator>MSBuild:Compile</Generator> <Generator>MSBuild:Compile</Generator>
</Page> </Page>
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<Page Update="Controls\AboutControl.xaml"> <Page Update="Controls\AboutControl.xaml">
<Generator>MSBuild:Compile</Generator> <Generator>MSBuild:Compile</Generator>
</Page> </Page>
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<Page Update="Styles\InteractiveListViewHeaderStyle.xaml"> <Page Update="Styles\InteractiveListViewHeaderStyle.xaml">
<Generator>MSBuild:Compile</Generator> <Generator>MSBuild:Compile</Generator>
</Page> </Page>
</ItemGroup>
<ItemGroup>
<Folder Include="PluginConfigs\" />
</ItemGroup> </ItemGroup>
<!-- Publish Properties --> <!-- Publish Properties -->
<PropertyGroup> <PropertyGroup>

View File

@@ -196,23 +196,23 @@
<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" />
<ComboBoxItem x:Uid="SettingsPageEasingTypeEaseInOutSine" /> <ComboBoxItem x:Uid="SettingsPageEasingTypeEaseSine" />
<ComboBoxItem x:Uid="SettingsPageEasingTypeEaseInOutQuad" /> <ComboBoxItem x:Uid="SettingsPageEasingTypeEaseQuad" />
<ComboBoxItem x:Uid="SettingsPageEasingTypeEaseInOutCubic" /> <ComboBoxItem x:Uid="SettingsPageEasingTypeEaseCubic" />
<ComboBoxItem x:Uid="SettingsPageEasingTypeEaseInOutQuart" /> <ComboBoxItem x:Uid="SettingsPageEasingTypeEaseQuart" />
<ComboBoxItem x:Uid="SettingsPageEasingTypeEaseInOutQuint" /> <ComboBoxItem x:Uid="SettingsPageEasingTypeEaseQuint" />
<ComboBoxItem x:Uid="SettingsPageEasingTypeEaseInOutExpo" /> <ComboBoxItem x:Uid="SettingsPageEasingTypeEaseExpo" />
<ComboBoxItem x:Uid="SettingsPageEasingTypeEaseInOutCirc" /> <ComboBoxItem x:Uid="SettingsPageEasingTypeEaseCirc" />
<ComboBoxItem x:Uid="SettingsPageEasingTypeEaseInOutBack" /> <ComboBoxItem x:Uid="SettingsPageEasingTypeEaseBack" />
<ComboBoxItem x:Uid="SettingsPageEasingTypeEaseInOutElastic" /> <ComboBoxItem x:Uid="SettingsPageEasingTypeEaseElastic" />
<ComboBoxItem x:Uid="SettingsPageEasingTypeEaseInOutBounce" /> <ComboBoxItem x:Uid="SettingsPageEasingTypeEaseBounce" />
</ComboBox> </ComboBox>
<dev:SettingsExpander.Items> <dev:SettingsExpander.Items>
<dev:SettingsCard Header="Easing Mode"> <dev:SettingsCard x:Uid="SettingsPageEasingMode">
<ComboBox SelectedIndex="{x:Bind LyricsEffectSettings.LyricsScrollEasingMode, Mode=TwoWay, Converter={StaticResource EnumToIntConverter}}"> <ComboBox SelectedIndex="{x:Bind LyricsEffectSettings.LyricsScrollEasingMode, Mode=TwoWay, Converter={StaticResource EnumToIntConverter}}">
<ComboBoxItem Content="EaseIn" /> <ComboBoxItem x:Uid="SettingsPageEasingModeIn" />
<ComboBoxItem Content="EaseOut" /> <ComboBoxItem x:Uid="SettingsPageEasingModeOut" />
<ComboBoxItem Content="EaseInOut" /> <ComboBoxItem x:Uid="SettingsPageEasingModeInOut" />
</ComboBox> </ComboBox>
</dev:SettingsCard> </dev:SettingsCard>
<dev:SettingsCard x:Uid="SettingsPageScrollTopDuration"> <dev:SettingsCard x:Uid="SettingsPageScrollTopDuration">

View File

@@ -0,0 +1,20 @@
<?xml version="1.0" encoding="utf-8" ?>
<linker>
<assembly fullname="FlaUI.UIA3" preserve="all" />
<assembly fullname="Interop.UIAutomationClient" preserve="all" />
<assembly fullname="Microsoft.EntityFrameworkCore" preserve="all" />
<assembly fullname="Microsoft.EntityFrameworkCore.Abstractions" preserve="all" />
<assembly fullname="Microsoft.EntityFrameworkCore.Relational" preserve="all" />
<assembly fullname="Microsoft.EntityFrameworkCore.Sqlite" preserve="all" />
<assembly fullname="NAudio.Wasapi" preserve="all" />
<assembly fullname="TagLibSharp" preserve="all" />
<assembly fullname="Vanara.PInvoke.DwmApi" preserve="all" />
<assembly fullname="Vanara.PInvoke.Gdi32" preserve="all" />
<assembly fullname="Vanara.PInvoke.Shell32" preserve="all" />
<assembly fullname="Vanara.PInvoke.User32" preserve="all" />
<assembly fullname="Vanara.Windows.Shell" preserve="all" />
</linker>

View File

@@ -129,7 +129,7 @@ namespace BetterLyrics.WinUI3.Parsers.LyricsParser
{ {
romaji = await transliterationService.TransliterateText(main.WrappedOriginalText, PhoneticHelper.RomanCode, token); romaji = await transliterationService.TransliterateText(main.WrappedOriginalText, PhoneticHelper.RomanCode, token);
_lyricsDataArr.FirstOrDefault()?.SetTransliteration(romaji); _lyricsDataArr.FirstOrDefault()?.SetTransliteration(romaji);
transliterationSearchProvider = TransliterationSearchProvider.CutletDocker; transliterationSearchProvider = TransliterationSearchProvider.Plugin;
} }
catch (TaskCanceledException) { } catch (TaskCanceledException) { }
catch (Exception) catch (Exception)

View File

@@ -0,0 +1,15 @@
<linker>
<assembly fullname="System.Collections" preserve="all" />
<assembly fullname="System.IO.MemoryMappedFiles" preserve="all" />
<assembly fullname="System.Linq" preserve="all" />
<assembly fullname="System.Memory" preserve="all" />
<assembly fullname="System.ObjectModel" preserve="all" />
<assembly fullname="System.Runtime" preserve="all" />
<assembly fullname="System.Runtime.InteropServices" preserve="all" />
<assembly fullname="System.Text.RegularExpressions" preserve="all" />
<assembly fullname="System.Threading" preserve="all" />
<assembly fullname="BetterLyrics.WinUI3">
<type fullname="BetterLyrics.WinUI3.PluginConfigs.BetterLyrics_Plugins_Romaji_Config" preserve="all" />
</assembly>
</linker>

View File

@@ -0,0 +1,137 @@
// Auto-Generated by PluginAnalyzer
using System.Diagnostics.CodeAnalysis;
using System.Runtime.CompilerServices;
namespace BetterLyrics.WinUI3.PluginConfigs;
internal static class BetterLyrics_Plugins_Romaji_Config
{
[DynamicDependency(DynamicallyAccessedMemberTypes.All, typeof(System.AppContext))]
[DynamicDependency(DynamicallyAccessedMemberTypes.All, typeof(System.AppDomain))]
[DynamicDependency(DynamicallyAccessedMemberTypes.All, typeof(System.ArgumentException))]
[DynamicDependency(DynamicallyAccessedMemberTypes.All, typeof(System.ArgumentNullException))]
[DynamicDependency(DynamicallyAccessedMemberTypes.All, typeof(System.ArgumentOutOfRangeException))]
[DynamicDependency(DynamicallyAccessedMemberTypes.All, typeof(System.Array))]
[DynamicDependency(DynamicallyAccessedMemberTypes.All, typeof(System.AsyncCallback))]
[DynamicDependency(DynamicallyAccessedMemberTypes.All, typeof(System.Boolean))]
[DynamicDependency(DynamicallyAccessedMemberTypes.All, typeof(System.Buffer))]
[DynamicDependency(DynamicallyAccessedMemberTypes.All, typeof(System.Byte))]
[DynamicDependency(DynamicallyAccessedMemberTypes.All, typeof(System.Char))]
[DynamicDependency(DynamicallyAccessedMemberTypes.All, typeof(System.Collections.Generic.Dictionary<,>))]
[DynamicDependency(DynamicallyAccessedMemberTypes.All, typeof(System.Collections.Generic.IEnumerable<>))]
[DynamicDependency(DynamicallyAccessedMemberTypes.All, typeof(System.Collections.Generic.IEnumerator<>))]
[DynamicDependency(DynamicallyAccessedMemberTypes.All, typeof(System.Collections.Generic.LinkedList<>))]
[DynamicDependency(DynamicallyAccessedMemberTypes.All, typeof(System.Collections.Generic.LinkedListNode<>))]
[DynamicDependency(DynamicallyAccessedMemberTypes.All, typeof(System.Collections.Generic.List<>))]
[DynamicDependency(DynamicallyAccessedMemberTypes.All, typeof(System.Collections.IEnumerable))]
[DynamicDependency(DynamicallyAccessedMemberTypes.All, typeof(System.Collections.IEnumerator))]
[DynamicDependency(DynamicallyAccessedMemberTypes.All, typeof(System.Collections.ObjectModel.Collection<>))]
[DynamicDependency(DynamicallyAccessedMemberTypes.All, typeof(System.Collections.ObjectModel.ObservableCollection<>))]
[DynamicDependency(DynamicallyAccessedMemberTypes.All, typeof(System.ComponentModel.INotifyPropertyChanged))]
[DynamicDependency(DynamicallyAccessedMemberTypes.All, typeof(System.ComponentModel.PropertyChangedEventArgs))]
[DynamicDependency(DynamicallyAccessedMemberTypes.All, typeof(System.ComponentModel.PropertyChangedEventHandler))]
[DynamicDependency(DynamicallyAccessedMemberTypes.All, typeof(System.Delegate))]
[DynamicDependency(DynamicallyAccessedMemberTypes.All, typeof(System.Diagnostics.DebuggableAttribute))]
[DynamicDependency(DynamicallyAccessedMemberTypes.All, typeof(System.Diagnostics.DebuggableAttribute.DebuggingModes))]
[DynamicDependency(DynamicallyAccessedMemberTypes.All, typeof(System.Diagnostics.DebuggerBrowsableAttribute))]
[DynamicDependency(DynamicallyAccessedMemberTypes.All, typeof(System.Diagnostics.DebuggerBrowsableState))]
[DynamicDependency(DynamicallyAccessedMemberTypes.All, typeof(System.Diagnostics.DebuggerHiddenAttribute))]
[DynamicDependency(DynamicallyAccessedMemberTypes.All, typeof(System.Enum))]
[DynamicDependency(DynamicallyAccessedMemberTypes.All, typeof(System.Environment))]
[DynamicDependency(DynamicallyAccessedMemberTypes.All, typeof(System.Exception))]
[DynamicDependency(DynamicallyAccessedMemberTypes.All, typeof(System.Func<,>))]
[DynamicDependency(DynamicallyAccessedMemberTypes.All, typeof(System.GC))]
[DynamicDependency(DynamicallyAccessedMemberTypes.All, typeof(System.IAsyncResult))]
[DynamicDependency(DynamicallyAccessedMemberTypes.All, typeof(System.IComparable<>))]
[DynamicDependency(DynamicallyAccessedMemberTypes.All, typeof(System.IDisposable))]
[DynamicDependency(DynamicallyAccessedMemberTypes.All, typeof(System.Int16))]
[DynamicDependency(DynamicallyAccessedMemberTypes.All, typeof(System.Int32))]
[DynamicDependency(DynamicallyAccessedMemberTypes.All, typeof(System.Int64))]
[DynamicDependency(DynamicallyAccessedMemberTypes.All, typeof(System.InvalidOperationException))]
[DynamicDependency(DynamicallyAccessedMemberTypes.All, typeof(System.IO.BinaryReader))]
[DynamicDependency(DynamicallyAccessedMemberTypes.All, typeof(System.IO.File))]
[DynamicDependency(DynamicallyAccessedMemberTypes.All, typeof(System.IO.FileAccess))]
[DynamicDependency(DynamicallyAccessedMemberTypes.All, typeof(System.IO.FileMode))]
[DynamicDependency(DynamicallyAccessedMemberTypes.All, typeof(System.IO.FileShare))]
[DynamicDependency(DynamicallyAccessedMemberTypes.All, typeof(System.IO.FileStream))]
[DynamicDependency(DynamicallyAccessedMemberTypes.All, typeof(System.IO.HandleInheritability))]
[DynamicDependency(DynamicallyAccessedMemberTypes.All, typeof(System.IO.MemoryMappedFiles.MemoryMappedFile))]
[DynamicDependency(DynamicallyAccessedMemberTypes.All, typeof(System.IO.MemoryMappedFiles.MemoryMappedFileAccess))]
[DynamicDependency(DynamicallyAccessedMemberTypes.All, typeof(System.IO.MemoryMappedFiles.MemoryMappedViewAccessor))]
[DynamicDependency(DynamicallyAccessedMemberTypes.All, typeof(System.IO.MemoryMappedFiles.MemoryMappedViewStream))]
[DynamicDependency(DynamicallyAccessedMemberTypes.All, typeof(System.IO.Path))]
[DynamicDependency(DynamicallyAccessedMemberTypes.All, typeof(System.IO.Stream))]
[DynamicDependency(DynamicallyAccessedMemberTypes.All, typeof(System.IO.StreamReader))]
[DynamicDependency(DynamicallyAccessedMemberTypes.All, typeof(System.IO.TextReader))]
[DynamicDependency(DynamicallyAccessedMemberTypes.All, typeof(System.IO.UnmanagedMemoryAccessor))]
[DynamicDependency(DynamicallyAccessedMemberTypes.All, typeof(System.Linq.Enumerable))]
[DynamicDependency(DynamicallyAccessedMemberTypes.All, typeof(System.Linq.IGrouping<,>))]
[DynamicDependency(DynamicallyAccessedMemberTypes.All, typeof(System.Math))]
[DynamicDependency(DynamicallyAccessedMemberTypes.All, typeof(System.MemoryExtensions))]
[DynamicDependency(DynamicallyAccessedMemberTypes.All, typeof(System.MulticastDelegate))]
[DynamicDependency(DynamicallyAccessedMemberTypes.All, typeof(System.NotImplementedException))]
[DynamicDependency(DynamicallyAccessedMemberTypes.All, typeof(System.NotSupportedException))]
[DynamicDependency(DynamicallyAccessedMemberTypes.All, typeof(System.Nullable<>))]
[DynamicDependency(DynamicallyAccessedMemberTypes.All, typeof(System.Object))]
[DynamicDependency(DynamicallyAccessedMemberTypes.All, typeof(System.ObjectDisposedException))]
[DynamicDependency(DynamicallyAccessedMemberTypes.All, typeof(System.ObsoleteAttribute))]
[DynamicDependency(DynamicallyAccessedMemberTypes.All, typeof(System.ParamArrayAttribute))]
[DynamicDependency(DynamicallyAccessedMemberTypes.All, typeof(System.ReadOnlySpan<>))]
[DynamicDependency(DynamicallyAccessedMemberTypes.All, typeof(System.Reflection.Assembly))]
[DynamicDependency(DynamicallyAccessedMemberTypes.All, typeof(System.Reflection.AssemblyCompanyAttribute))]
[DynamicDependency(DynamicallyAccessedMemberTypes.All, typeof(System.Reflection.AssemblyConfigurationAttribute))]
[DynamicDependency(DynamicallyAccessedMemberTypes.All, typeof(System.Reflection.AssemblyCopyrightAttribute))]
[DynamicDependency(DynamicallyAccessedMemberTypes.All, typeof(System.Reflection.AssemblyDescriptionAttribute))]
[DynamicDependency(DynamicallyAccessedMemberTypes.All, typeof(System.Reflection.AssemblyFileVersionAttribute))]
[DynamicDependency(DynamicallyAccessedMemberTypes.All, typeof(System.Reflection.AssemblyInformationalVersionAttribute))]
[DynamicDependency(DynamicallyAccessedMemberTypes.All, typeof(System.Reflection.AssemblyMetadataAttribute))]
[DynamicDependency(DynamicallyAccessedMemberTypes.All, typeof(System.Reflection.AssemblyProductAttribute))]
[DynamicDependency(DynamicallyAccessedMemberTypes.All, typeof(System.Reflection.AssemblyTitleAttribute))]
[DynamicDependency(DynamicallyAccessedMemberTypes.All, typeof(System.Reflection.AssemblyTrademarkAttribute))]
[DynamicDependency(DynamicallyAccessedMemberTypes.All, typeof(System.Reflection.DefaultMemberAttribute))]
[DynamicDependency(DynamicallyAccessedMemberTypes.All, typeof(System.Runtime.CompilerServices.CallerMemberNameAttribute))]
[DynamicDependency(DynamicallyAccessedMemberTypes.All, typeof(System.Runtime.CompilerServices.CompilationRelaxationsAttribute))]
[DynamicDependency(DynamicallyAccessedMemberTypes.All, typeof(System.Runtime.CompilerServices.CompilerGeneratedAttribute))]
[DynamicDependency(DynamicallyAccessedMemberTypes.All, typeof(System.Runtime.CompilerServices.ExtensionAttribute))]
[DynamicDependency(DynamicallyAccessedMemberTypes.All, typeof(System.Runtime.CompilerServices.IsReadOnlyAttribute))]
[DynamicDependency(DynamicallyAccessedMemberTypes.All, typeof(System.Runtime.CompilerServices.IteratorStateMachineAttribute))]
[DynamicDependency(DynamicallyAccessedMemberTypes.All, typeof(System.Runtime.CompilerServices.NullableAttribute))]
[DynamicDependency(DynamicallyAccessedMemberTypes.All, typeof(System.Runtime.CompilerServices.NullableContextAttribute))]
[DynamicDependency(DynamicallyAccessedMemberTypes.All, typeof(System.Runtime.CompilerServices.RefSafetyRulesAttribute))]
[DynamicDependency(DynamicallyAccessedMemberTypes.All, typeof(System.Runtime.CompilerServices.RuntimeCompatibilityAttribute))]
[DynamicDependency(DynamicallyAccessedMemberTypes.All, typeof(System.Runtime.CompilerServices.TupleElementNamesAttribute))]
[DynamicDependency(DynamicallyAccessedMemberTypes.All, typeof(System.Runtime.InteropServices.InAttribute))]
[DynamicDependency(DynamicallyAccessedMemberTypes.All, typeof(System.Runtime.Serialization.SerializationInfo))]
[DynamicDependency(DynamicallyAccessedMemberTypes.All, typeof(System.Runtime.Serialization.StreamingContext))]
[DynamicDependency(DynamicallyAccessedMemberTypes.All, typeof(System.Runtime.Versioning.SupportedOSPlatformAttribute))]
[DynamicDependency(DynamicallyAccessedMemberTypes.All, typeof(System.Runtime.Versioning.TargetFrameworkAttribute))]
[DynamicDependency(DynamicallyAccessedMemberTypes.All, typeof(System.Runtime.Versioning.TargetPlatformAttribute))]
[DynamicDependency(DynamicallyAccessedMemberTypes.All, typeof(System.Security.Permissions.SecurityAction))]
[DynamicDependency(DynamicallyAccessedMemberTypes.All, typeof(System.Security.Permissions.SecurityPermissionAttribute))]
[DynamicDependency(DynamicallyAccessedMemberTypes.All, typeof(System.Security.UnverifiableCodeAttribute))]
[DynamicDependency(DynamicallyAccessedMemberTypes.All, typeof(System.Single))]
[DynamicDependency(DynamicallyAccessedMemberTypes.All, typeof(System.String))]
[DynamicDependency(DynamicallyAccessedMemberTypes.All, typeof(System.StringSplitOptions))]
[DynamicDependency(DynamicallyAccessedMemberTypes.All, typeof(System.Text.Encoding))]
[DynamicDependency(DynamicallyAccessedMemberTypes.All, typeof(System.Text.RegularExpressions.Capture))]
[DynamicDependency(DynamicallyAccessedMemberTypes.All, typeof(System.Text.RegularExpressions.Group))]
[DynamicDependency(DynamicallyAccessedMemberTypes.All, typeof(System.Text.RegularExpressions.GroupCollection))]
[DynamicDependency(DynamicallyAccessedMemberTypes.All, typeof(System.Text.RegularExpressions.Match))]
[DynamicDependency(DynamicallyAccessedMemberTypes.All, typeof(System.Text.RegularExpressions.MatchCollection))]
[DynamicDependency(DynamicallyAccessedMemberTypes.All, typeof(System.Text.RegularExpressions.Regex))]
[DynamicDependency(DynamicallyAccessedMemberTypes.All, typeof(System.Text.RegularExpressions.RegexOptions))]
[DynamicDependency(DynamicallyAccessedMemberTypes.All, typeof(System.Text.StringBuilder))]
[DynamicDependency(DynamicallyAccessedMemberTypes.All, typeof(System.Threading.Interlocked))]
[DynamicDependency(DynamicallyAccessedMemberTypes.All, typeof(System.Threading.Tasks.Task))]
[DynamicDependency(DynamicallyAccessedMemberTypes.All, typeof(System.Threading.Tasks.Task<>))]
[DynamicDependency(DynamicallyAccessedMemberTypes.All, typeof(System.TimeSpan))]
[DynamicDependency(DynamicallyAccessedMemberTypes.All, typeof(System.Type))]
[DynamicDependency(DynamicallyAccessedMemberTypes.All, typeof(System.UInt16))]
[DynamicDependency(DynamicallyAccessedMemberTypes.All, typeof(System.UInt32))]
[DynamicDependency(DynamicallyAccessedMemberTypes.All, typeof(System.ValueTuple<,>))]
[DynamicDependency(DynamicallyAccessedMemberTypes.All, typeof(System.ValueType))]
[ModuleInitializer]
internal static void Initialize()
{
// This method runs automatically on startup.
}
}

View File

@@ -5,6 +5,7 @@ using System.Collections.Generic;
using System.IO; using System.IO;
using System.IO.Compression; using System.IO.Compression;
using System.Linq; using System.Linq;
using System.Reflection;
using Windows.Storage; using Windows.Storage;
namespace BetterLyrics.WinUI3.Services.PluginService namespace BetterLyrics.WinUI3.Services.PluginService
@@ -45,58 +46,91 @@ namespace BetterLyrics.WinUI3.Services.PluginService
private void TryLoadPlugin(string dllPath) private void TryLoadPlugin(string dllPath)
{ {
// 1. Create Context
var loadContext = new PluginLoadContext(dllPath);
try try
{ {
var loadContext = new PluginLoadContext(dllPath);
var assembly = loadContext.LoadFromAssemblyPath(dllPath); var assembly = loadContext.LoadFromAssemblyPath(dllPath);
bool isPluginFound = false; int loadedCount = 0; // Track successfully loaded plugins
foreach (var type in assembly.GetExportedTypes()) // 2. [Safety Check] Safely retrieve types
IEnumerable<Type> types;
try
{ {
if (typeof(IPlugin).IsAssignableFrom(type) && !type.IsAbstract) types = assembly.GetExportedTypes();
}
catch (ReflectionTypeLoadException ex)
{
// If some types fail to load, only keep the usable ones!
types = ex.Types.Where(t => t != null)!;
foreach (var loaderEx in ex.LoaderExceptions)
{ {
var plugin = (IPlugin?)Activator.CreateInstance(type); _logger.LogWarning("Partial type loading failure in DLL {path}: {msg}", dllPath, loaderEx?.Message);
if (plugin == null) continue;
if (_plugins.Any(p => p.Id == plugin.Id))
{
// 遇到重复 ID我们选择跳过新的保留旧的
// (或者你也可以设计成卸载旧的加载新的,这取决于策略)
// 由于我们已经加载了 assembly现在决定不用它必须卸载 context
loadContext.Unload();
return;
}
try
{
plugin.Initialize();
}
catch (Exception initEx)
{
_logger.LogError(initEx, "Failed to initialize plugin {id} from {path}", plugin.Id, dllPath);
loadContext.Unload();
return;
}
_plugins.Add(plugin);
_pluginContexts.Add(plugin.Id, loadContext);
isPluginFound = true;
} }
} }
if (isPluginFound) foreach (var type in types)
{
// 3. Check if it is a valid plugin class
if (typeof(IPlugin).IsAssignableFrom(type) && !type.IsAbstract)
{
IPlugin? plugin = null;
try
{
// 4. [Instantiation Guard] Prevent plugin constructor errors from crashing the main app
plugin = (IPlugin?)Activator.CreateInstance(type);
if (plugin == null) continue;
// 5. Check for duplicate IDs
if (_plugins.Any(p => p.Id == plugin.Id))
{
_logger.LogWarning("Skipping duplicate plugin: {id} ({path})", plugin.Id, dllPath);
// Explicitly break reference to aid Unload
plugin = null;
continue;
}
// 6. Initialize
plugin.Initialize();
// 7. Add to collection
_plugins.Add(plugin);
_pluginContexts.Add(plugin.Id, loadContext);
loadedCount++;
}
catch (Exception ex)
{
_logger.LogError(ex, "Failed to initialize/instantiate plugin {type}", type.FullName);
// If plugin initialization fails, explicitly dispose if possible
if (plugin is IDisposable disposable)
{
try { disposable.Dispose(); } catch { }
}
plugin = null; // Break reference
}
}
}
// 8. Finalize: If no usable plugins were found in this DLL, unload Context
if (loadedCount > 0)
{ {
_loadedDllPaths.Add(dllPath); _loadedDllPaths.Add(dllPath);
_logger.LogInformation("Successfully loaded {count} plugin(s) from {path}", loadedCount, dllPath);
} }
else else
{ {
_logger.LogWarning("No valid plugin types found in assembly {path}", dllPath); _logger.LogWarning("No valid plugins found in {path}. Unloading context.", dllPath);
// No plugin instances remain alive at this point, safe to unload
loadContext.Unload(); loadContext.Unload();
} }
} }
catch (Exception ex) catch (Exception ex)
{ {
_logger.LogError(ex, "Failed to load plugin from {path}", dllPath); _logger.LogError(ex, "Failed to load assembly: {path}", dllPath);
// Only unload here if the loading process completely crashed
try { loadContext.Unload(); } catch { }
} }
} }

View File

@@ -26,31 +26,6 @@ namespace BetterLyrics.WinUI3.Services.TransliterationService
_httpClient = new HttpClient(); _httpClient = new HttpClient();
} }
//public async Task<string> TransliterateText(string text, string targetLangCode, CancellationToken token)
//{
// if (string.IsNullOrWhiteSpace(text))
// {
// throw new Exception(text + " is empty or null.");
// }
// if (string.IsNullOrEmpty(_settingsService.AppSettings.TranslationSettings.CutletDockerServer))
// {
// throw new Exception("cutlet-docker server URL is not set in settings.");
// }
// var request = new CutletDockerRequest { Text = text };
// var reqJson = System.Text.Json.JsonSerializer.Serialize(request, SourceGenerationContext.Default.CutletDockerRequest);
// var url = $"{_settingsService.AppSettings.TranslationSettings.CutletDockerServer}/convert";
// var response = await _httpClient.PostAsync(url, new StringContent(reqJson, Encoding.UTF8, "application/json"));
// response.EnsureSuccessStatusCode();
// var resJson = await response.Content.ReadAsStringAsync(token);
// var result = System.Text.Json.JsonSerializer.Deserialize(resJson, SourceGenerationContext.Default.CutletDockerResponse);
// return result?.RomajiText ?? string.Empty;
//}
public async Task<string> TransliterateText(string text, string targetLangCode, CancellationToken token) public async Task<string> TransliterateText(string text, string targetLangCode, CancellationToken token)
{ {
string? result = null; string? result = null;

View File

@@ -810,34 +810,37 @@
<data name="SettingsPageDragArea.Header" xml:space="preserve"> <data name="SettingsPageDragArea.Header" xml:space="preserve">
<value>منطقة قابلة للسحب</value> <value>منطقة قابلة للسحب</value>
</data> </data>
<data name="SettingsPageEasingTypeEaseInOutBack.Content" xml:space="preserve"> <data name="SettingsPageEasingModeOut.Content" xml:space="preserve">
<value />
</data>
<data name="SettingsPageEasingTypeEaseBack.Content" xml:space="preserve">
<value>EaseInOutBack</value> <value>EaseInOutBack</value>
</data> </data>
<data name="SettingsPageEasingTypeEaseInOutBounce.Content" xml:space="preserve"> <data name="SettingsPageEasingTypeEaseBounce.Content" xml:space="preserve">
<value>EaseInOutBounce</value> <value>EaseInOutBounce</value>
</data> </data>
<data name="SettingsPageEasingTypeEaseInOutCirc.Content" xml:space="preserve"> <data name="SettingsPageEasingTypeEaseCirc.Content" xml:space="preserve">
<value>EaseInOutCirc</value> <value>EaseInOutCirc</value>
</data> </data>
<data name="SettingsPageEasingTypeEaseInOutCubic.Content" xml:space="preserve"> <data name="SettingsPageEasingTypeEaseCubic.Content" xml:space="preserve">
<value>EaseInOutCubic</value> <value>EaseInOutCubic</value>
</data> </data>
<data name="SettingsPageEasingTypeEaseInOutElastic.Content" xml:space="preserve"> <data name="SettingsPageEasingTypeEaseElastic.Content" xml:space="preserve">
<value>EaseInOutElastic</value> <value>EaseInOutElastic</value>
</data> </data>
<data name="SettingsPageEasingTypeEaseInOutExpo.Content" xml:space="preserve"> <data name="SettingsPageEasingTypeEaseExpo.Content" xml:space="preserve">
<value>EaseInOutExpo</value> <value>EaseInOutExpo</value>
</data> </data>
<data name="SettingsPageEasingTypeEaseInOutQuad.Content" xml:space="preserve"> <data name="SettingsPageEasingTypeEaseQuad.Content" xml:space="preserve">
<value>EaseInOutQuad</value> <value>EaseInOutQuad</value>
</data> </data>
<data name="SettingsPageEasingTypeEaseInOutQuart.Content" xml:space="preserve"> <data name="SettingsPageEasingTypeEaseQuart.Content" xml:space="preserve">
<value>EaseInOutQuart</value> <value>EaseInOutQuart</value>
</data> </data>
<data name="SettingsPageEasingTypeEaseInOutQuint.Content" xml:space="preserve"> <data name="SettingsPageEasingTypeEaseQuint.Content" xml:space="preserve">
<value>EaseInOutQuint</value> <value>EaseInOutQuint</value>
</data> </data>
<data name="SettingsPageEasingTypeEaseInOutSine.Content" xml:space="preserve"> <data name="SettingsPageEasingTypeEaseSine.Content" xml:space="preserve">
<value>EaseInOutSine</value> <value>EaseInOutSine</value>
</data> </data>
<data name="SettingsPageEasingTypeLinear.Content" xml:space="preserve"> <data name="SettingsPageEasingTypeLinear.Content" xml:space="preserve">

View File

@@ -810,35 +810,38 @@
<data name="SettingsPageDragArea.Header" xml:space="preserve"> <data name="SettingsPageDragArea.Header" xml:space="preserve">
<value>Ziehbereich</value> <value>Ziehbereich</value>
</data> </data>
<data name="SettingsPageEasingTypeEaseInOutBack.Content" xml:space="preserve"> <data name="SettingsPageEasingModeOut.Content" xml:space="preserve">
<value>Back Ease In-Out</value> <value />
</data> </data>
<data name="SettingsPageEasingTypeEaseInOutBounce.Content" xml:space="preserve"> <data name="SettingsPageEasingTypeEaseBack.Content" xml:space="preserve">
<value>Bounce Ease In-Out</value> <value>Back</value>
</data> </data>
<data name="SettingsPageEasingTypeEaseInOutCirc.Content" xml:space="preserve"> <data name="SettingsPageEasingTypeEaseBounce.Content" xml:space="preserve">
<value>Circular Ease In-Out</value> <value>Bounce</value>
</data> </data>
<data name="SettingsPageEasingTypeEaseInOutCubic.Content" xml:space="preserve"> <data name="SettingsPageEasingTypeEaseCirc.Content" xml:space="preserve">
<value>Cubic Ease In-Out</value> <value>Circular</value>
</data> </data>
<data name="SettingsPageEasingTypeEaseInOutElastic.Content" xml:space="preserve"> <data name="SettingsPageEasingTypeEaseCubic.Content" xml:space="preserve">
<value>Elastic Ease In-Out</value> <value>Cubic</value>
</data> </data>
<data name="SettingsPageEasingTypeEaseInOutExpo.Content" xml:space="preserve"> <data name="SettingsPageEasingTypeEaseElastic.Content" xml:space="preserve">
<value>Exponential Ease In-Out</value> <value>Elastic</value>
</data> </data>
<data name="SettingsPageEasingTypeEaseInOutQuad.Content" xml:space="preserve"> <data name="SettingsPageEasingTypeEaseExpo.Content" xml:space="preserve">
<value>Quadratic Ease In-Out</value> <value>Exponential</value>
</data> </data>
<data name="SettingsPageEasingTypeEaseInOutQuart.Content" xml:space="preserve"> <data name="SettingsPageEasingTypeEaseQuad.Content" xml:space="preserve">
<value>Quartic Ease In-Out</value> <value>Quadratic</value>
</data> </data>
<data name="SettingsPageEasingTypeEaseInOutQuint.Content" xml:space="preserve"> <data name="SettingsPageEasingTypeEaseQuart.Content" xml:space="preserve">
<value>Quintic Ease In-Out</value> <value>Quartic</value>
</data> </data>
<data name="SettingsPageEasingTypeEaseInOutSine.Content" xml:space="preserve"> <data name="SettingsPageEasingTypeEaseQuint.Content" xml:space="preserve">
<value>Sine Ease In-Out</value> <value>Quintic</value>
</data>
<data name="SettingsPageEasingTypeEaseSine.Content" xml:space="preserve">
<value>Sine</value>
</data> </data>
<data name="SettingsPageEasingTypeLinear.Content" xml:space="preserve"> <data name="SettingsPageEasingTypeLinear.Content" xml:space="preserve">
<value>Linear</value> <value>Linear</value>

View File

@@ -810,35 +810,47 @@
<data name="SettingsPageDragArea.Header" xml:space="preserve"> <data name="SettingsPageDragArea.Header" xml:space="preserve">
<value>Draggable Area</value> <value>Draggable Area</value>
</data> </data>
<data name="SettingsPageEasingTypeEaseInOutBack.Content" xml:space="preserve"> <data name="SettingsPageEasingMode.Header" xml:space="preserve">
<value>Back Ease In-Out</value> <value>Easing Mode</value>
</data> </data>
<data name="SettingsPageEasingTypeEaseInOutBounce.Content" xml:space="preserve"> <data name="SettingsPageEasingModeIn.Content" xml:space="preserve">
<value>Bounce Ease In-Out</value> <value>In</value>
</data> </data>
<data name="SettingsPageEasingTypeEaseInOutCirc.Content" xml:space="preserve"> <data name="SettingsPageEasingModeInOut.Content" xml:space="preserve">
<value>Circular Ease In-Out</value> <value>In-Out</value>
</data> </data>
<data name="SettingsPageEasingTypeEaseInOutCubic.Content" xml:space="preserve"> <data name="SettingsPageEasingModeOut.Content" xml:space="preserve">
<value>Cubic Ease In-Out</value> <value>Out</value>
</data> </data>
<data name="SettingsPageEasingTypeEaseInOutElastic.Content" xml:space="preserve"> <data name="SettingsPageEasingTypeEaseBack.Content" xml:space="preserve">
<value>Elastic Ease In-Out</value> <value>Back</value>
</data> </data>
<data name="SettingsPageEasingTypeEaseInOutExpo.Content" xml:space="preserve"> <data name="SettingsPageEasingTypeEaseBounce.Content" xml:space="preserve">
<value>Exponential Ease In-Out</value> <value>Bounce</value>
</data> </data>
<data name="SettingsPageEasingTypeEaseInOutQuad.Content" xml:space="preserve"> <data name="SettingsPageEasingTypeEaseCirc.Content" xml:space="preserve">
<value>Quadratic Ease In-Out</value> <value>Circular</value>
</data> </data>
<data name="SettingsPageEasingTypeEaseInOutQuart.Content" xml:space="preserve"> <data name="SettingsPageEasingTypeEaseCubic.Content" xml:space="preserve">
<value>Quartic Ease In-Out</value> <value>Cubic</value>
</data> </data>
<data name="SettingsPageEasingTypeEaseInOutQuint.Content" xml:space="preserve"> <data name="SettingsPageEasingTypeEaseElastic.Content" xml:space="preserve">
<value>Quintic Ease In-Out</value> <value>Elastic</value>
</data> </data>
<data name="SettingsPageEasingTypeEaseInOutSine.Content" xml:space="preserve"> <data name="SettingsPageEasingTypeEaseExpo.Content" xml:space="preserve">
<value>Sine Ease In-Out</value> <value>Exponential</value>
</data>
<data name="SettingsPageEasingTypeEaseQuad.Content" xml:space="preserve">
<value>Quadratic</value>
</data>
<data name="SettingsPageEasingTypeEaseQuart.Content" xml:space="preserve">
<value>Quartic</value>
</data>
<data name="SettingsPageEasingTypeEaseQuint.Content" xml:space="preserve">
<value>Quintic</value>
</data>
<data name="SettingsPageEasingTypeEaseSine.Content" xml:space="preserve">
<value>Sine</value>
</data> </data>
<data name="SettingsPageEasingTypeLinear.Content" xml:space="preserve"> <data name="SettingsPageEasingTypeLinear.Content" xml:space="preserve">
<value>Linear</value> <value>Linear</value>

View File

@@ -810,35 +810,41 @@
<data name="SettingsPageDragArea.Header" xml:space="preserve"> <data name="SettingsPageDragArea.Header" xml:space="preserve">
<value>Área arrastrable</value> <value>Área arrastrable</value>
</data> </data>
<data name="SettingsPageEasingTypeEaseInOutBack.Content" xml:space="preserve"> <data name="SettingsPageEasingMode.Header" xml:space="preserve">
<value>Back Ease In-Out</value> <value />
</data> </data>
<data name="SettingsPageEasingTypeEaseInOutBounce.Content" xml:space="preserve"> <data name="SettingsPageEasingModeOut.Content" xml:space="preserve">
<value>Bounce Ease In-Out</value> <value />
</data> </data>
<data name="SettingsPageEasingTypeEaseInOutCirc.Content" xml:space="preserve"> <data name="SettingsPageEasingTypeEaseBack.Content" xml:space="preserve">
<value>Circular Ease In-Out</value> <value>Back</value>
</data> </data>
<data name="SettingsPageEasingTypeEaseInOutCubic.Content" xml:space="preserve"> <data name="SettingsPageEasingTypeEaseBounce.Content" xml:space="preserve">
<value>Cubic Ease In-Out</value> <value>Bounce</value>
</data> </data>
<data name="SettingsPageEasingTypeEaseInOutElastic.Content" xml:space="preserve"> <data name="SettingsPageEasingTypeEaseCirc.Content" xml:space="preserve">
<value>Elastic Ease In-Out</value> <value>Circular</value>
</data> </data>
<data name="SettingsPageEasingTypeEaseInOutExpo.Content" xml:space="preserve"> <data name="SettingsPageEasingTypeEaseCubic.Content" xml:space="preserve">
<value>Exponential Ease In-Out</value> <value>Cubic</value>
</data> </data>
<data name="SettingsPageEasingTypeEaseInOutQuad.Content" xml:space="preserve"> <data name="SettingsPageEasingTypeEaseElastic.Content" xml:space="preserve">
<value>Quadratic Ease In-Out</value> <value>Elastic</value>
</data> </data>
<data name="SettingsPageEasingTypeEaseInOutQuart.Content" xml:space="preserve"> <data name="SettingsPageEasingTypeEaseExpo.Content" xml:space="preserve">
<value>Quartic Ease In-Out</value> <value>Exponential</value>
</data> </data>
<data name="SettingsPageEasingTypeEaseInOutQuint.Content" xml:space="preserve"> <data name="SettingsPageEasingTypeEaseQuad.Content" xml:space="preserve">
<value>Quintic Ease In-Out</value> <value>Quadratic</value>
</data> </data>
<data name="SettingsPageEasingTypeEaseInOutSine.Content" xml:space="preserve"> <data name="SettingsPageEasingTypeEaseQuart.Content" xml:space="preserve">
<value>Sine Ease In-Out</value> <value>Quartic</value>
</data>
<data name="SettingsPageEasingTypeEaseQuint.Content" xml:space="preserve">
<value>Quintic</value>
</data>
<data name="SettingsPageEasingTypeEaseSine.Content" xml:space="preserve">
<value>Sine</value>
</data> </data>
<data name="SettingsPageEasingTypeLinear.Content" xml:space="preserve"> <data name="SettingsPageEasingTypeLinear.Content" xml:space="preserve">
<value>Lineal</value> <value>Lineal</value>

View File

@@ -810,35 +810,38 @@
<data name="SettingsPageDragArea.Header" xml:space="preserve"> <data name="SettingsPageDragArea.Header" xml:space="preserve">
<value>Zone déplaçable</value> <value>Zone déplaçable</value>
</data> </data>
<data name="SettingsPageEasingTypeEaseInOutBack.Content" xml:space="preserve"> <data name="SettingsPageEasingModeOut.Content" xml:space="preserve">
<value>Back Ease In-Out</value> <value />
</data> </data>
<data name="SettingsPageEasingTypeEaseInOutBounce.Content" xml:space="preserve"> <data name="SettingsPageEasingTypeEaseBack.Content" xml:space="preserve">
<value>Bounce Ease In-Out</value> <value>Back</value>
</data> </data>
<data name="SettingsPageEasingTypeEaseInOutCirc.Content" xml:space="preserve"> <data name="SettingsPageEasingTypeEaseBounce.Content" xml:space="preserve">
<value>Circular Ease In-Out</value> <value>Bounce</value>
</data> </data>
<data name="SettingsPageEasingTypeEaseInOutCubic.Content" xml:space="preserve"> <data name="SettingsPageEasingTypeEaseCirc.Content" xml:space="preserve">
<value>Cubic Ease In-Out</value> <value>Circular</value>
</data> </data>
<data name="SettingsPageEasingTypeEaseInOutElastic.Content" xml:space="preserve"> <data name="SettingsPageEasingTypeEaseCubic.Content" xml:space="preserve">
<value>Elastic Ease In-Out</value> <value>Cubic</value>
</data> </data>
<data name="SettingsPageEasingTypeEaseInOutExpo.Content" xml:space="preserve"> <data name="SettingsPageEasingTypeEaseElastic.Content" xml:space="preserve">
<value>Exponential Ease In-Out</value> <value>Elastic</value>
</data> </data>
<data name="SettingsPageEasingTypeEaseInOutQuad.Content" xml:space="preserve"> <data name="SettingsPageEasingTypeEaseExpo.Content" xml:space="preserve">
<value>Quadratic Ease In-Out</value> <value>Exponential</value>
</data> </data>
<data name="SettingsPageEasingTypeEaseInOutQuart.Content" xml:space="preserve"> <data name="SettingsPageEasingTypeEaseQuad.Content" xml:space="preserve">
<value>Quartic Ease In-Out</value> <value>Quadratic</value>
</data> </data>
<data name="SettingsPageEasingTypeEaseInOutQuint.Content" xml:space="preserve"> <data name="SettingsPageEasingTypeEaseQuart.Content" xml:space="preserve">
<value>Quintic Ease In-Out</value> <value>Quartic</value>
</data> </data>
<data name="SettingsPageEasingTypeEaseInOutSine.Content" xml:space="preserve"> <data name="SettingsPageEasingTypeEaseQuint.Content" xml:space="preserve">
<value>Sine Ease In-Out</value> <value>Quintic</value>
</data>
<data name="SettingsPageEasingTypeEaseSine.Content" xml:space="preserve">
<value>Sine</value>
</data> </data>
<data name="SettingsPageEasingTypeLinear.Content" xml:space="preserve"> <data name="SettingsPageEasingTypeLinear.Content" xml:space="preserve">
<value>Linéaire</value> <value>Linéaire</value>

View File

@@ -810,34 +810,37 @@
<data name="SettingsPageDragArea.Header" xml:space="preserve"> <data name="SettingsPageDragArea.Header" xml:space="preserve">
<value>खींचने योग्य क्षेत्र</value> <value>खींचने योग्य क्षेत्र</value>
</data> </data>
<data name="SettingsPageEasingTypeEaseInOutBack.Content" xml:space="preserve"> <data name="SettingsPageEasingModeOut.Content" xml:space="preserve">
<value />
</data>
<data name="SettingsPageEasingTypeEaseBack.Content" xml:space="preserve">
<value>EaseInOutBack</value> <value>EaseInOutBack</value>
</data> </data>
<data name="SettingsPageEasingTypeEaseInOutBounce.Content" xml:space="preserve"> <data name="SettingsPageEasingTypeEaseBounce.Content" xml:space="preserve">
<value>EaseInOutBounce</value> <value>EaseInOutBounce</value>
</data> </data>
<data name="SettingsPageEasingTypeEaseInOutCirc.Content" xml:space="preserve"> <data name="SettingsPageEasingTypeEaseCirc.Content" xml:space="preserve">
<value>EaseInOutCirc</value> <value>EaseInOutCirc</value>
</data> </data>
<data name="SettingsPageEasingTypeEaseInOutCubic.Content" xml:space="preserve"> <data name="SettingsPageEasingTypeEaseCubic.Content" xml:space="preserve">
<value>EaseInOutCubic</value> <value>EaseInOutCubic</value>
</data> </data>
<data name="SettingsPageEasingTypeEaseInOutElastic.Content" xml:space="preserve"> <data name="SettingsPageEasingTypeEaseElastic.Content" xml:space="preserve">
<value>EaseInOutElastic</value> <value>EaseInOutElastic</value>
</data> </data>
<data name="SettingsPageEasingTypeEaseInOutExpo.Content" xml:space="preserve"> <data name="SettingsPageEasingTypeEaseExpo.Content" xml:space="preserve">
<value>EaseInOutExpo</value> <value>EaseInOutExpo</value>
</data> </data>
<data name="SettingsPageEasingTypeEaseInOutQuad.Content" xml:space="preserve"> <data name="SettingsPageEasingTypeEaseQuad.Content" xml:space="preserve">
<value>EaseInOutQuad</value> <value>EaseInOutQuad</value>
</data> </data>
<data name="SettingsPageEasingTypeEaseInOutQuart.Content" xml:space="preserve"> <data name="SettingsPageEasingTypeEaseQuart.Content" xml:space="preserve">
<value>EaseInOutQuart</value> <value>EaseInOutQuart</value>
</data> </data>
<data name="SettingsPageEasingTypeEaseInOutQuint.Content" xml:space="preserve"> <data name="SettingsPageEasingTypeEaseQuint.Content" xml:space="preserve">
<value>EaseInOutQuint</value> <value>EaseInOutQuint</value>
</data> </data>
<data name="SettingsPageEasingTypeEaseInOutSine.Content" xml:space="preserve"> <data name="SettingsPageEasingTypeEaseSine.Content" xml:space="preserve">
<value>EaseInOutSine</value> <value>EaseInOutSine</value>
</data> </data>
<data name="SettingsPageEasingTypeLinear.Content" xml:space="preserve"> <data name="SettingsPageEasingTypeLinear.Content" xml:space="preserve">

View File

@@ -810,34 +810,37 @@
<data name="SettingsPageDragArea.Header" xml:space="preserve"> <data name="SettingsPageDragArea.Header" xml:space="preserve">
<value>Area yang Dapat Diseret</value> <value>Area yang Dapat Diseret</value>
</data> </data>
<data name="SettingsPageEasingTypeEaseInOutBack.Content" xml:space="preserve"> <data name="SettingsPageEasingModeOut.Content" xml:space="preserve">
<value />
</data>
<data name="SettingsPageEasingTypeEaseBack.Content" xml:space="preserve">
<value>EaseInOutBack</value> <value>EaseInOutBack</value>
</data> </data>
<data name="SettingsPageEasingTypeEaseInOutBounce.Content" xml:space="preserve"> <data name="SettingsPageEasingTypeEaseBounce.Content" xml:space="preserve">
<value>EaseInOutBounce</value> <value>EaseInOutBounce</value>
</data> </data>
<data name="SettingsPageEasingTypeEaseInOutCirc.Content" xml:space="preserve"> <data name="SettingsPageEasingTypeEaseCirc.Content" xml:space="preserve">
<value>EaseInOutCirc</value> <value>EaseInOutCirc</value>
</data> </data>
<data name="SettingsPageEasingTypeEaseInOutCubic.Content" xml:space="preserve"> <data name="SettingsPageEasingTypeEaseCubic.Content" xml:space="preserve">
<value>EaseInOutCubic</value> <value>EaseInOutCubic</value>
</data> </data>
<data name="SettingsPageEasingTypeEaseInOutElastic.Content" xml:space="preserve"> <data name="SettingsPageEasingTypeEaseElastic.Content" xml:space="preserve">
<value>EaseInOutElastic</value> <value>EaseInOutElastic</value>
</data> </data>
<data name="SettingsPageEasingTypeEaseInOutExpo.Content" xml:space="preserve"> <data name="SettingsPageEasingTypeEaseExpo.Content" xml:space="preserve">
<value>EaseInOutExpo</value> <value>EaseInOutExpo</value>
</data> </data>
<data name="SettingsPageEasingTypeEaseInOutQuad.Content" xml:space="preserve"> <data name="SettingsPageEasingTypeEaseQuad.Content" xml:space="preserve">
<value>EaseInOutQuad</value> <value>EaseInOutQuad</value>
</data> </data>
<data name="SettingsPageEasingTypeEaseInOutQuart.Content" xml:space="preserve"> <data name="SettingsPageEasingTypeEaseQuart.Content" xml:space="preserve">
<value>EaseInOutQuart</value> <value>EaseInOutQuart</value>
</data> </data>
<data name="SettingsPageEasingTypeEaseInOutQuint.Content" xml:space="preserve"> <data name="SettingsPageEasingTypeEaseQuint.Content" xml:space="preserve">
<value>EaseInOutQuint</value> <value>EaseInOutQuint</value>
</data> </data>
<data name="SettingsPageEasingTypeEaseInOutSine.Content" xml:space="preserve"> <data name="SettingsPageEasingTypeEaseSine.Content" xml:space="preserve">
<value>EaseInOutSine</value> <value>EaseInOutSine</value>
</data> </data>
<data name="SettingsPageEasingTypeLinear.Content" xml:space="preserve"> <data name="SettingsPageEasingTypeLinear.Content" xml:space="preserve">

View File

@@ -810,34 +810,37 @@
<data name="SettingsPageDragArea.Header" xml:space="preserve"> <data name="SettingsPageDragArea.Header" xml:space="preserve">
<value>ドラッグ可能エリア</value> <value>ドラッグ可能エリア</value>
</data> </data>
<data name="SettingsPageEasingTypeEaseInOutBack.Content" xml:space="preserve"> <data name="SettingsPageEasingModeOut.Content" xml:space="preserve">
<value />
</data>
<data name="SettingsPageEasingTypeEaseBack.Content" xml:space="preserve">
<value>バックイーズ イン アウト</value> <value>バックイーズ イン アウト</value>
</data> </data>
<data name="SettingsPageEasingTypeEaseInOutBounce.Content" xml:space="preserve"> <data name="SettingsPageEasingTypeEaseBounce.Content" xml:space="preserve">
<value>バウンスイーズ イン アウト</value> <value>バウンスイーズ イン アウト</value>
</data> </data>
<data name="SettingsPageEasingTypeEaseInOutCirc.Content" xml:space="preserve"> <data name="SettingsPageEasingTypeEaseCirc.Content" xml:space="preserve">
<value>サーキュラーイーズ イン アウト</value> <value>サーキュラーイーズ イン アウト</value>
</data> </data>
<data name="SettingsPageEasingTypeEaseInOutCubic.Content" xml:space="preserve"> <data name="SettingsPageEasingTypeEaseCubic.Content" xml:space="preserve">
<value>キュービックイーズ イン アウト</value> <value>キュービックイーズ イン アウト</value>
</data> </data>
<data name="SettingsPageEasingTypeEaseInOutElastic.Content" xml:space="preserve"> <data name="SettingsPageEasingTypeEaseElastic.Content" xml:space="preserve">
<value>エラスティックイーズ イン アウト</value> <value>エラスティックイーズ イン アウト</value>
</data> </data>
<data name="SettingsPageEasingTypeEaseInOutExpo.Content" xml:space="preserve"> <data name="SettingsPageEasingTypeEaseExpo.Content" xml:space="preserve">
<value>エキスポネンシャルイーズ イン アウト</value> <value>エキスポネンシャルイーズ イン アウト</value>
</data> </data>
<data name="SettingsPageEasingTypeEaseInOutQuad.Content" xml:space="preserve"> <data name="SettingsPageEasingTypeEaseQuad.Content" xml:space="preserve">
<value>クアドラティックイーズ イン アウト</value> <value>クアドラティックイーズ イン アウト</value>
</data> </data>
<data name="SettingsPageEasingTypeEaseInOutQuart.Content" xml:space="preserve"> <data name="SettingsPageEasingTypeEaseQuart.Content" xml:space="preserve">
<value>クオートイーズ イン アウト</value> <value>クオートイーズ イン アウト</value>
</data> </data>
<data name="SettingsPageEasingTypeEaseInOutQuint.Content" xml:space="preserve"> <data name="SettingsPageEasingTypeEaseQuint.Content" xml:space="preserve">
<value>クイントイーズ イン アウト</value> <value>クイントイーズ イン アウト</value>
</data> </data>
<data name="SettingsPageEasingTypeEaseInOutSine.Content" xml:space="preserve"> <data name="SettingsPageEasingTypeEaseSine.Content" xml:space="preserve">
<value>サインイーズ イン アウト</value> <value>サインイーズ イン アウト</value>
</data> </data>
<data name="SettingsPageEasingTypeLinear.Content" xml:space="preserve"> <data name="SettingsPageEasingTypeLinear.Content" xml:space="preserve">

View File

@@ -810,35 +810,38 @@
<data name="SettingsPageDragArea.Header" xml:space="preserve"> <data name="SettingsPageDragArea.Header" xml:space="preserve">
<value>드래그 가능 영역</value> <value>드래그 가능 영역</value>
</data> </data>
<data name="SettingsPageEasingTypeEaseInOutBack.Content" xml:space="preserve"> <data name="SettingsPageEasingModeOut.Content" xml:space="preserve">
<value>Back Ease In-Out</value> <value />
</data> </data>
<data name="SettingsPageEasingTypeEaseInOutBounce.Content" xml:space="preserve"> <data name="SettingsPageEasingTypeEaseBack.Content" xml:space="preserve">
<value>Bounce Ease In-Out</value> <value>Back</value>
</data> </data>
<data name="SettingsPageEasingTypeEaseInOutCirc.Content" xml:space="preserve"> <data name="SettingsPageEasingTypeEaseBounce.Content" xml:space="preserve">
<value>Circular Ease In-Out</value> <value>Bounce</value>
</data> </data>
<data name="SettingsPageEasingTypeEaseInOutCubic.Content" xml:space="preserve"> <data name="SettingsPageEasingTypeEaseCirc.Content" xml:space="preserve">
<value>Cubic Ease In-Out</value> <value>Circular</value>
</data> </data>
<data name="SettingsPageEasingTypeEaseInOutElastic.Content" xml:space="preserve"> <data name="SettingsPageEasingTypeEaseCubic.Content" xml:space="preserve">
<value>Elastic Ease In-Out</value> <value>Cubic</value>
</data> </data>
<data name="SettingsPageEasingTypeEaseInOutExpo.Content" xml:space="preserve"> <data name="SettingsPageEasingTypeEaseElastic.Content" xml:space="preserve">
<value>Exponential Ease In-Out</value> <value>Elastic</value>
</data> </data>
<data name="SettingsPageEasingTypeEaseInOutQuad.Content" xml:space="preserve"> <data name="SettingsPageEasingTypeEaseExpo.Content" xml:space="preserve">
<value>Quadratic Ease In-Out</value> <value>Exponential</value>
</data> </data>
<data name="SettingsPageEasingTypeEaseInOutQuart.Content" xml:space="preserve"> <data name="SettingsPageEasingTypeEaseQuad.Content" xml:space="preserve">
<value>Quartic Ease In-Out</value> <value>Quadratic</value>
</data> </data>
<data name="SettingsPageEasingTypeEaseInOutQuint.Content" xml:space="preserve"> <data name="SettingsPageEasingTypeEaseQuart.Content" xml:space="preserve">
<value>Quintic Ease In-Out</value> <value>Quartic</value>
</data> </data>
<data name="SettingsPageEasingTypeEaseInOutSine.Content" xml:space="preserve"> <data name="SettingsPageEasingTypeEaseQuint.Content" xml:space="preserve">
<value>Sine Ease In-Out</value> <value>Quintic</value>
</data>
<data name="SettingsPageEasingTypeEaseSine.Content" xml:space="preserve">
<value>Sine</value>
</data> </data>
<data name="SettingsPageEasingTypeLinear.Content" xml:space="preserve"> <data name="SettingsPageEasingTypeLinear.Content" xml:space="preserve">
<value>Linear (선형)</value> <value>Linear (선형)</value>

View File

@@ -810,34 +810,37 @@
<data name="SettingsPageDragArea.Header" xml:space="preserve"> <data name="SettingsPageDragArea.Header" xml:space="preserve">
<value>Kawasan Boleh Diseret</value> <value>Kawasan Boleh Diseret</value>
</data> </data>
<data name="SettingsPageEasingTypeEaseInOutBack.Content" xml:space="preserve"> <data name="SettingsPageEasingModeOut.Content" xml:space="preserve">
<value />
</data>
<data name="SettingsPageEasingTypeEaseBack.Content" xml:space="preserve">
<value>EaseInOutBack</value> <value>EaseInOutBack</value>
</data> </data>
<data name="SettingsPageEasingTypeEaseInOutBounce.Content" xml:space="preserve"> <data name="SettingsPageEasingTypeEaseBounce.Content" xml:space="preserve">
<value>EaseInOutBounce</value> <value>EaseInOutBounce</value>
</data> </data>
<data name="SettingsPageEasingTypeEaseInOutCirc.Content" xml:space="preserve"> <data name="SettingsPageEasingTypeEaseCirc.Content" xml:space="preserve">
<value>EaseInOutCirc</value> <value>EaseInOutCirc</value>
</data> </data>
<data name="SettingsPageEasingTypeEaseInOutCubic.Content" xml:space="preserve"> <data name="SettingsPageEasingTypeEaseCubic.Content" xml:space="preserve">
<value>EaseInOutCubic</value> <value>EaseInOutCubic</value>
</data> </data>
<data name="SettingsPageEasingTypeEaseInOutElastic.Content" xml:space="preserve"> <data name="SettingsPageEasingTypeEaseElastic.Content" xml:space="preserve">
<value>EaseInOutElastic</value> <value>EaseInOutElastic</value>
</data> </data>
<data name="SettingsPageEasingTypeEaseInOutExpo.Content" xml:space="preserve"> <data name="SettingsPageEasingTypeEaseExpo.Content" xml:space="preserve">
<value>EaseInOutExpo</value> <value>EaseInOutExpo</value>
</data> </data>
<data name="SettingsPageEasingTypeEaseInOutQuad.Content" xml:space="preserve"> <data name="SettingsPageEasingTypeEaseQuad.Content" xml:space="preserve">
<value>EaseInOutQuad</value> <value>EaseInOutQuad</value>
</data> </data>
<data name="SettingsPageEasingTypeEaseInOutQuart.Content" xml:space="preserve"> <data name="SettingsPageEasingTypeEaseQuart.Content" xml:space="preserve">
<value>EaseInOutQuart</value> <value>EaseInOutQuart</value>
</data> </data>
<data name="SettingsPageEasingTypeEaseInOutQuint.Content" xml:space="preserve"> <data name="SettingsPageEasingTypeEaseQuint.Content" xml:space="preserve">
<value>EaseInOutQuint</value> <value>EaseInOutQuint</value>
</data> </data>
<data name="SettingsPageEasingTypeEaseInOutSine.Content" xml:space="preserve"> <data name="SettingsPageEasingTypeEaseSine.Content" xml:space="preserve">
<value>EaseInOutSine</value> <value>EaseInOutSine</value>
</data> </data>
<data name="SettingsPageEasingTypeLinear.Content" xml:space="preserve"> <data name="SettingsPageEasingTypeLinear.Content" xml:space="preserve">

View File

@@ -810,34 +810,37 @@
<data name="SettingsPageDragArea.Header" xml:space="preserve"> <data name="SettingsPageDragArea.Header" xml:space="preserve">
<value>Área de Arrastar</value> <value>Área de Arrastar</value>
</data> </data>
<data name="SettingsPageEasingTypeEaseInOutBack.Content" xml:space="preserve"> <data name="SettingsPageEasingModeOut.Content" xml:space="preserve">
<value />
</data>
<data name="SettingsPageEasingTypeEaseBack.Content" xml:space="preserve">
<value>EaseInOutBack</value> <value>EaseInOutBack</value>
</data> </data>
<data name="SettingsPageEasingTypeEaseInOutBounce.Content" xml:space="preserve"> <data name="SettingsPageEasingTypeEaseBounce.Content" xml:space="preserve">
<value>EaseInOutBounce</value> <value>EaseInOutBounce</value>
</data> </data>
<data name="SettingsPageEasingTypeEaseInOutCirc.Content" xml:space="preserve"> <data name="SettingsPageEasingTypeEaseCirc.Content" xml:space="preserve">
<value>EaseInOutCirc</value> <value>EaseInOutCirc</value>
</data> </data>
<data name="SettingsPageEasingTypeEaseInOutCubic.Content" xml:space="preserve"> <data name="SettingsPageEasingTypeEaseCubic.Content" xml:space="preserve">
<value>EaseInOutCubic</value> <value>EaseInOutCubic</value>
</data> </data>
<data name="SettingsPageEasingTypeEaseInOutElastic.Content" xml:space="preserve"> <data name="SettingsPageEasingTypeEaseElastic.Content" xml:space="preserve">
<value>EaseInOutElastic</value> <value>EaseInOutElastic</value>
</data> </data>
<data name="SettingsPageEasingTypeEaseInOutExpo.Content" xml:space="preserve"> <data name="SettingsPageEasingTypeEaseExpo.Content" xml:space="preserve">
<value>EaseInOutExpo</value> <value>EaseInOutExpo</value>
</data> </data>
<data name="SettingsPageEasingTypeEaseInOutQuad.Content" xml:space="preserve"> <data name="SettingsPageEasingTypeEaseQuad.Content" xml:space="preserve">
<value>EaseInOutQuad</value> <value>EaseInOutQuad</value>
</data> </data>
<data name="SettingsPageEasingTypeEaseInOutQuart.Content" xml:space="preserve"> <data name="SettingsPageEasingTypeEaseQuart.Content" xml:space="preserve">
<value>EaseInOutQuart</value> <value>EaseInOutQuart</value>
</data> </data>
<data name="SettingsPageEasingTypeEaseInOutQuint.Content" xml:space="preserve"> <data name="SettingsPageEasingTypeEaseQuint.Content" xml:space="preserve">
<value>EaseInOutQuint</value> <value>EaseInOutQuint</value>
</data> </data>
<data name="SettingsPageEasingTypeEaseInOutSine.Content" xml:space="preserve"> <data name="SettingsPageEasingTypeEaseSine.Content" xml:space="preserve">
<value>EaseInOutSine</value> <value>EaseInOutSine</value>
</data> </data>
<data name="SettingsPageEasingTypeLinear.Content" xml:space="preserve"> <data name="SettingsPageEasingTypeLinear.Content" xml:space="preserve">

View File

@@ -810,35 +810,38 @@
<data name="SettingsPageDragArea.Header" xml:space="preserve"> <data name="SettingsPageDragArea.Header" xml:space="preserve">
<value>Перетаскиваемая область</value> <value>Перетаскиваемая область</value>
</data> </data>
<data name="SettingsPageEasingTypeEaseInOutBack.Content" xml:space="preserve"> <data name="SettingsPageEasingModeOut.Content" xml:space="preserve">
<value>Back Ease In-Out</value> <value />
</data> </data>
<data name="SettingsPageEasingTypeEaseInOutBounce.Content" xml:space="preserve"> <data name="SettingsPageEasingTypeEaseBack.Content" xml:space="preserve">
<value>Bounce Ease In-Out</value> <value>Back</value>
</data> </data>
<data name="SettingsPageEasingTypeEaseInOutCirc.Content" xml:space="preserve"> <data name="SettingsPageEasingTypeEaseBounce.Content" xml:space="preserve">
<value>Circular Ease In-Out</value> <value>Bounce</value>
</data> </data>
<data name="SettingsPageEasingTypeEaseInOutCubic.Content" xml:space="preserve"> <data name="SettingsPageEasingTypeEaseCirc.Content" xml:space="preserve">
<value>Cubic Ease In-Out</value> <value>Circular</value>
</data> </data>
<data name="SettingsPageEasingTypeEaseInOutElastic.Content" xml:space="preserve"> <data name="SettingsPageEasingTypeEaseCubic.Content" xml:space="preserve">
<value>Elastic Ease In-Out</value> <value>Cubic</value>
</data> </data>
<data name="SettingsPageEasingTypeEaseInOutExpo.Content" xml:space="preserve"> <data name="SettingsPageEasingTypeEaseElastic.Content" xml:space="preserve">
<value>Exponential Ease In-Out</value> <value>Elastic</value>
</data> </data>
<data name="SettingsPageEasingTypeEaseInOutQuad.Content" xml:space="preserve"> <data name="SettingsPageEasingTypeEaseExpo.Content" xml:space="preserve">
<value>Quadratic Ease In-Out</value> <value>Exponential</value>
</data> </data>
<data name="SettingsPageEasingTypeEaseInOutQuart.Content" xml:space="preserve"> <data name="SettingsPageEasingTypeEaseQuad.Content" xml:space="preserve">
<value>Quartic Ease In-Out</value> <value>Quadratic</value>
</data> </data>
<data name="SettingsPageEasingTypeEaseInOutQuint.Content" xml:space="preserve"> <data name="SettingsPageEasingTypeEaseQuart.Content" xml:space="preserve">
<value>Quintic Ease In-Out</value> <value>Quartic</value>
</data> </data>
<data name="SettingsPageEasingTypeEaseInOutSine.Content" xml:space="preserve"> <data name="SettingsPageEasingTypeEaseQuint.Content" xml:space="preserve">
<value>Sine Ease In-Out</value> <value>Quintic</value>
</data>
<data name="SettingsPageEasingTypeEaseSine.Content" xml:space="preserve">
<value>Sine</value>
</data> </data>
<data name="SettingsPageEasingTypeLinear.Content" xml:space="preserve"> <data name="SettingsPageEasingTypeLinear.Content" xml:space="preserve">
<value>Linear</value> <value>Linear</value>

View File

@@ -810,34 +810,37 @@
<data name="SettingsPageDragArea.Header" xml:space="preserve"> <data name="SettingsPageDragArea.Header" xml:space="preserve">
<value>พื้นที่ลาก</value> <value>พื้นที่ลาก</value>
</data> </data>
<data name="SettingsPageEasingTypeEaseInOutBack.Content" xml:space="preserve"> <data name="SettingsPageEasingModeOut.Content" xml:space="preserve">
<value />
</data>
<data name="SettingsPageEasingTypeEaseBack.Content" xml:space="preserve">
<value>EaseInOutBack</value> <value>EaseInOutBack</value>
</data> </data>
<data name="SettingsPageEasingTypeEaseInOutBounce.Content" xml:space="preserve"> <data name="SettingsPageEasingTypeEaseBounce.Content" xml:space="preserve">
<value>EaseInOutBounce</value> <value>EaseInOutBounce</value>
</data> </data>
<data name="SettingsPageEasingTypeEaseInOutCirc.Content" xml:space="preserve"> <data name="SettingsPageEasingTypeEaseCirc.Content" xml:space="preserve">
<value>EaseInOutCirc</value> <value>EaseInOutCirc</value>
</data> </data>
<data name="SettingsPageEasingTypeEaseInOutCubic.Content" xml:space="preserve"> <data name="SettingsPageEasingTypeEaseCubic.Content" xml:space="preserve">
<value>EaseInOutCubic</value> <value>EaseInOutCubic</value>
</data> </data>
<data name="SettingsPageEasingTypeEaseInOutElastic.Content" xml:space="preserve"> <data name="SettingsPageEasingTypeEaseElastic.Content" xml:space="preserve">
<value>EaseInOutElastic</value> <value>EaseInOutElastic</value>
</data> </data>
<data name="SettingsPageEasingTypeEaseInOutExpo.Content" xml:space="preserve"> <data name="SettingsPageEasingTypeEaseExpo.Content" xml:space="preserve">
<value>EaseInOutExpo</value> <value>EaseInOutExpo</value>
</data> </data>
<data name="SettingsPageEasingTypeEaseInOutQuad.Content" xml:space="preserve"> <data name="SettingsPageEasingTypeEaseQuad.Content" xml:space="preserve">
<value>EaseInOutQuad</value> <value>EaseInOutQuad</value>
</data> </data>
<data name="SettingsPageEasingTypeEaseInOutQuart.Content" xml:space="preserve"> <data name="SettingsPageEasingTypeEaseQuart.Content" xml:space="preserve">
<value>EaseInOutQuart</value> <value>EaseInOutQuart</value>
</data> </data>
<data name="SettingsPageEasingTypeEaseInOutQuint.Content" xml:space="preserve"> <data name="SettingsPageEasingTypeEaseQuint.Content" xml:space="preserve">
<value>EaseInOutQuint</value> <value>EaseInOutQuint</value>
</data> </data>
<data name="SettingsPageEasingTypeEaseInOutSine.Content" xml:space="preserve"> <data name="SettingsPageEasingTypeEaseSine.Content" xml:space="preserve">
<value>EaseInOutSine</value> <value>EaseInOutSine</value>
</data> </data>
<data name="SettingsPageEasingTypeLinear.Content" xml:space="preserve"> <data name="SettingsPageEasingTypeLinear.Content" xml:space="preserve">

View File

@@ -810,34 +810,37 @@
<data name="SettingsPageDragArea.Header" xml:space="preserve"> <data name="SettingsPageDragArea.Header" xml:space="preserve">
<value>Vùng có thể kéo</value> <value>Vùng có thể kéo</value>
</data> </data>
<data name="SettingsPageEasingTypeEaseInOutBack.Content" xml:space="preserve"> <data name="SettingsPageEasingModeOut.Content" xml:space="preserve">
<value />
</data>
<data name="SettingsPageEasingTypeEaseBack.Content" xml:space="preserve">
<value>EaseInOutBack</value> <value>EaseInOutBack</value>
</data> </data>
<data name="SettingsPageEasingTypeEaseInOutBounce.Content" xml:space="preserve"> <data name="SettingsPageEasingTypeEaseBounce.Content" xml:space="preserve">
<value>EaseInOutBounce</value> <value>EaseInOutBounce</value>
</data> </data>
<data name="SettingsPageEasingTypeEaseInOutCirc.Content" xml:space="preserve"> <data name="SettingsPageEasingTypeEaseCirc.Content" xml:space="preserve">
<value>EaseInOutCirc</value> <value>EaseInOutCirc</value>
</data> </data>
<data name="SettingsPageEasingTypeEaseInOutCubic.Content" xml:space="preserve"> <data name="SettingsPageEasingTypeEaseCubic.Content" xml:space="preserve">
<value>EaseInOutCubic</value> <value>EaseInOutCubic</value>
</data> </data>
<data name="SettingsPageEasingTypeEaseInOutElastic.Content" xml:space="preserve"> <data name="SettingsPageEasingTypeEaseElastic.Content" xml:space="preserve">
<value>EaseInOutElastic</value> <value>EaseInOutElastic</value>
</data> </data>
<data name="SettingsPageEasingTypeEaseInOutExpo.Content" xml:space="preserve"> <data name="SettingsPageEasingTypeEaseExpo.Content" xml:space="preserve">
<value>EaseInOutExpo</value> <value>EaseInOutExpo</value>
</data> </data>
<data name="SettingsPageEasingTypeEaseInOutQuad.Content" xml:space="preserve"> <data name="SettingsPageEasingTypeEaseQuad.Content" xml:space="preserve">
<value>EaseInOutQuad</value> <value>EaseInOutQuad</value>
</data> </data>
<data name="SettingsPageEasingTypeEaseInOutQuart.Content" xml:space="preserve"> <data name="SettingsPageEasingTypeEaseQuart.Content" xml:space="preserve">
<value>EaseInOutQuart</value> <value>EaseInOutQuart</value>
</data> </data>
<data name="SettingsPageEasingTypeEaseInOutQuint.Content" xml:space="preserve"> <data name="SettingsPageEasingTypeEaseQuint.Content" xml:space="preserve">
<value>EaseInOutQuint</value> <value>EaseInOutQuint</value>
</data> </data>
<data name="SettingsPageEasingTypeEaseInOutSine.Content" xml:space="preserve"> <data name="SettingsPageEasingTypeEaseSine.Content" xml:space="preserve">
<value>EaseInOutSine</value> <value>EaseInOutSine</value>
</data> </data>
<data name="SettingsPageEasingTypeLinear.Content" xml:space="preserve"> <data name="SettingsPageEasingTypeLinear.Content" xml:space="preserve">

View File

@@ -810,35 +810,47 @@
<data name="SettingsPageDragArea.Header" xml:space="preserve"> <data name="SettingsPageDragArea.Header" xml:space="preserve">
<value>可拖动区域</value> <value>可拖动区域</value>
</data> </data>
<data name="SettingsPageEasingTypeEaseInOutBack.Content" xml:space="preserve"> <data name="SettingsPageEasingMode.Header" xml:space="preserve">
<value>回弹缓入缓出</value> <value>缓动类型</value>
</data> </data>
<data name="SettingsPageEasingTypeEaseInOutBounce.Content" xml:space="preserve"> <data name="SettingsPageEasingModeIn.Content" xml:space="preserve">
<value>弹跳缓入缓出</value> <value>缓入</value>
</data> </data>
<data name="SettingsPageEasingTypeEaseInOutCirc.Content" xml:space="preserve"> <data name="SettingsPageEasingModeInOut.Content" xml:space="preserve">
<value>圆形缓入缓出</value> <value>缓出</value>
</data> </data>
<data name="SettingsPageEasingTypeEaseInOutCubic.Content" xml:space="preserve"> <data name="SettingsPageEasingModeOut.Content" xml:space="preserve">
<value>三次缓入缓出</value> <value>缓入缓出</value>
</data> </data>
<data name="SettingsPageEasingTypeEaseInOutElastic.Content" xml:space="preserve"> <data name="SettingsPageEasingTypeEaseBack.Content" xml:space="preserve">
<value>弹性缓入缓出</value> <value>弹</value>
</data> </data>
<data name="SettingsPageEasingTypeEaseInOutExpo.Content" xml:space="preserve"> <data name="SettingsPageEasingTypeEaseBounce.Content" xml:space="preserve">
<value>指数缓入缓出</value> <value>弹跳</value>
</data> </data>
<data name="SettingsPageEasingTypeEaseInOutQuad.Content" xml:space="preserve"> <data name="SettingsPageEasingTypeEaseCirc.Content" xml:space="preserve">
<value>二次缓入缓出</value> <value>圆形</value>
</data> </data>
<data name="SettingsPageEasingTypeEaseInOutQuart.Content" xml:space="preserve"> <data name="SettingsPageEasingTypeEaseCubic.Content" xml:space="preserve">
<value>四次缓入缓出</value> <value>三次</value>
</data> </data>
<data name="SettingsPageEasingTypeEaseInOutQuint.Content" xml:space="preserve"> <data name="SettingsPageEasingTypeEaseElastic.Content" xml:space="preserve">
<value>五次缓入缓出</value> <value>弹性</value>
</data> </data>
<data name="SettingsPageEasingTypeEaseInOutSine.Content" xml:space="preserve"> <data name="SettingsPageEasingTypeEaseExpo.Content" xml:space="preserve">
<value>正弦缓入缓出</value> <value>指数</value>
</data>
<data name="SettingsPageEasingTypeEaseQuad.Content" xml:space="preserve">
<value>二次</value>
</data>
<data name="SettingsPageEasingTypeEaseQuart.Content" xml:space="preserve">
<value>四次</value>
</data>
<data name="SettingsPageEasingTypeEaseQuint.Content" xml:space="preserve">
<value>五次</value>
</data>
<data name="SettingsPageEasingTypeEaseSine.Content" xml:space="preserve">
<value>正弦</value>
</data> </data>
<data name="SettingsPageEasingTypeLinear.Content" xml:space="preserve"> <data name="SettingsPageEasingTypeLinear.Content" xml:space="preserve">
<value>线性</value> <value>线性</value>

View File

@@ -810,34 +810,37 @@
<data name="SettingsPageDragArea.Header" xml:space="preserve"> <data name="SettingsPageDragArea.Header" xml:space="preserve">
<value>可拖曳區域</value> <value>可拖曳區域</value>
</data> </data>
<data name="SettingsPageEasingTypeEaseInOutBack.Content" xml:space="preserve"> <data name="SettingsPageEasingModeOut.Content" xml:space="preserve">
<value />
</data>
<data name="SettingsPageEasingTypeEaseBack.Content" xml:space="preserve">
<value>回彈緩入緩出</value> <value>回彈緩入緩出</value>
</data> </data>
<data name="SettingsPageEasingTypeEaseInOutBounce.Content" xml:space="preserve"> <data name="SettingsPageEasingTypeEaseBounce.Content" xml:space="preserve">
<value>彈跳緩入緩出</value> <value>彈跳緩入緩出</value>
</data> </data>
<data name="SettingsPageEasingTypeEaseInOutCirc.Content" xml:space="preserve"> <data name="SettingsPageEasingTypeEaseCirc.Content" xml:space="preserve">
<value>圓形緩入緩出</value> <value>圓形緩入緩出</value>
</data> </data>
<data name="SettingsPageEasingTypeEaseInOutCubic.Content" xml:space="preserve"> <data name="SettingsPageEasingTypeEaseCubic.Content" xml:space="preserve">
<value>三次緩入緩出</value> <value>三次緩入緩出</value>
</data> </data>
<data name="SettingsPageEasingTypeEaseInOutElastic.Content" xml:space="preserve"> <data name="SettingsPageEasingTypeEaseElastic.Content" xml:space="preserve">
<value>彈性緩入緩出</value> <value>彈性緩入緩出</value>
</data> </data>
<data name="SettingsPageEasingTypeEaseInOutExpo.Content" xml:space="preserve"> <data name="SettingsPageEasingTypeEaseExpo.Content" xml:space="preserve">
<value>指數緩入緩出</value> <value>指數緩入緩出</value>
</data> </data>
<data name="SettingsPageEasingTypeEaseInOutQuad.Content" xml:space="preserve"> <data name="SettingsPageEasingTypeEaseQuad.Content" xml:space="preserve">
<value>二次緩入緩出</value> <value>二次緩入緩出</value>
</data> </data>
<data name="SettingsPageEasingTypeEaseInOutQuart.Content" xml:space="preserve"> <data name="SettingsPageEasingTypeEaseQuart.Content" xml:space="preserve">
<value>四次緩入緩出</value> <value>四次緩入緩出</value>
</data> </data>
<data name="SettingsPageEasingTypeEaseInOutQuint.Content" xml:space="preserve"> <data name="SettingsPageEasingTypeEaseQuint.Content" xml:space="preserve">
<value>五次緩入緩出</value> <value>五次緩入緩出</value>
</data> </data>
<data name="SettingsPageEasingTypeEaseInOutSine.Content" xml:space="preserve"> <data name="SettingsPageEasingTypeEaseSine.Content" xml:space="preserve">
<value>正弦緩入緩出</value> <value>正弦緩入緩出</value>
</data> </data>
<data name="SettingsPageEasingTypeLinear.Content" xml:space="preserve"> <data name="SettingsPageEasingTypeLinear.Content" xml:space="preserve">

View File

@@ -1,127 +0,0 @@

Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio Version 18
VisualStudioVersion = 18.1.11312.151
MinimumVisualStudioVersion = 10.0.40219.1
Project("{C7167F0D-BC9F-4E6E-AFE1-012C56B48DB5}") = "BetterLyrics.WinUI3 (Package)", "BetterLyrics.WinUI3\BetterLyrics.WinUI3 (Package)\BetterLyrics.WinUI3 (Package).wapproj", "{6576CD19-EF92-4099-B37D-E2D8EBDB6BF5}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "BetterLyrics.WinUI3", "BetterLyrics.WinUI3\BetterLyrics.WinUI3\BetterLyrics.WinUI3.csproj", "{6D26909A-9EE5-4D26-9E81-686BDE36A9D3}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Impressionist", "Impressionist\Impressionist\Impressionist.csproj", "{A678BCA5-03DE-71E4-73C1-388B7550E4E3}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ColorThief.WinUI3", "ColorThief.WinUI3\ColorThief.WinUI3.csproj", "{8F2FE667-2D91-428E-0630-05E6330F9625}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "BetterLyrics.Core", "BetterLyrics.Core\BetterLyrics.Core.csproj", "{0F47FE6F-D0AA-49E5-8F33-78DFDEB1F810}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "BetterLyrics.Plugins.Romaji", "BetterLyrics.Plugins.Romaji\BetterLyrics.Plugins.Romaji.csproj", "{DD2D477F-94CD-4D4B-8B59-C127F2850E34}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "RomajiConverter.Core", "RomajiConverter.Core\RomajiConverter.Core.csproj", "{351807DB-CD63-B939-8071-B1FBFF969569}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|ARM64 = Debug|ARM64
Debug|x64 = Debug|x64
Debug|x86 = Debug|x86
Release|ARM64 = Release|ARM64
Release|x64 = Release|x64
Release|x86 = Release|x86
EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
{6576CD19-EF92-4099-B37D-E2D8EBDB6BF5}.Debug|ARM64.ActiveCfg = Debug|ARM64
{6576CD19-EF92-4099-B37D-E2D8EBDB6BF5}.Debug|ARM64.Build.0 = Debug|ARM64
{6576CD19-EF92-4099-B37D-E2D8EBDB6BF5}.Debug|ARM64.Deploy.0 = Debug|ARM64
{6576CD19-EF92-4099-B37D-E2D8EBDB6BF5}.Debug|x64.ActiveCfg = Debug|x64
{6576CD19-EF92-4099-B37D-E2D8EBDB6BF5}.Debug|x64.Build.0 = Debug|x64
{6576CD19-EF92-4099-B37D-E2D8EBDB6BF5}.Debug|x64.Deploy.0 = Debug|x64
{6576CD19-EF92-4099-B37D-E2D8EBDB6BF5}.Debug|x86.ActiveCfg = Debug|x86
{6576CD19-EF92-4099-B37D-E2D8EBDB6BF5}.Debug|x86.Build.0 = Debug|x86
{6576CD19-EF92-4099-B37D-E2D8EBDB6BF5}.Debug|x86.Deploy.0 = Debug|x86
{6576CD19-EF92-4099-B37D-E2D8EBDB6BF5}.Release|ARM64.ActiveCfg = Release|ARM64
{6576CD19-EF92-4099-B37D-E2D8EBDB6BF5}.Release|ARM64.Build.0 = Release|ARM64
{6576CD19-EF92-4099-B37D-E2D8EBDB6BF5}.Release|ARM64.Deploy.0 = Release|ARM64
{6576CD19-EF92-4099-B37D-E2D8EBDB6BF5}.Release|x64.ActiveCfg = Release|x64
{6576CD19-EF92-4099-B37D-E2D8EBDB6BF5}.Release|x64.Build.0 = Release|x64
{6576CD19-EF92-4099-B37D-E2D8EBDB6BF5}.Release|x64.Deploy.0 = Release|x64
{6576CD19-EF92-4099-B37D-E2D8EBDB6BF5}.Release|x86.ActiveCfg = Release|x86
{6576CD19-EF92-4099-B37D-E2D8EBDB6BF5}.Release|x86.Build.0 = Release|x86
{6576CD19-EF92-4099-B37D-E2D8EBDB6BF5}.Release|x86.Deploy.0 = Release|x86
{6D26909A-9EE5-4D26-9E81-686BDE36A9D3}.Debug|ARM64.ActiveCfg = Debug|ARM64
{6D26909A-9EE5-4D26-9E81-686BDE36A9D3}.Debug|ARM64.Build.0 = Debug|ARM64
{6D26909A-9EE5-4D26-9E81-686BDE36A9D3}.Debug|x64.ActiveCfg = Debug|x64
{6D26909A-9EE5-4D26-9E81-686BDE36A9D3}.Debug|x64.Build.0 = Debug|x64
{6D26909A-9EE5-4D26-9E81-686BDE36A9D3}.Debug|x86.ActiveCfg = Debug|x86
{6D26909A-9EE5-4D26-9E81-686BDE36A9D3}.Debug|x86.Build.0 = Debug|x86
{6D26909A-9EE5-4D26-9E81-686BDE36A9D3}.Release|ARM64.ActiveCfg = Release|ARM64
{6D26909A-9EE5-4D26-9E81-686BDE36A9D3}.Release|ARM64.Build.0 = Release|ARM64
{6D26909A-9EE5-4D26-9E81-686BDE36A9D3}.Release|x64.ActiveCfg = Release|x64
{6D26909A-9EE5-4D26-9E81-686BDE36A9D3}.Release|x64.Build.0 = Release|x64
{6D26909A-9EE5-4D26-9E81-686BDE36A9D3}.Release|x86.ActiveCfg = Release|x86
{6D26909A-9EE5-4D26-9E81-686BDE36A9D3}.Release|x86.Build.0 = Release|x86
{A678BCA5-03DE-71E4-73C1-388B7550E4E3}.Debug|ARM64.ActiveCfg = Debug|Any CPU
{A678BCA5-03DE-71E4-73C1-388B7550E4E3}.Debug|ARM64.Build.0 = Debug|Any CPU
{A678BCA5-03DE-71E4-73C1-388B7550E4E3}.Debug|x64.ActiveCfg = Debug|Any CPU
{A678BCA5-03DE-71E4-73C1-388B7550E4E3}.Debug|x64.Build.0 = Debug|Any CPU
{A678BCA5-03DE-71E4-73C1-388B7550E4E3}.Debug|x86.ActiveCfg = Debug|Any CPU
{A678BCA5-03DE-71E4-73C1-388B7550E4E3}.Debug|x86.Build.0 = Debug|Any CPU
{A678BCA5-03DE-71E4-73C1-388B7550E4E3}.Release|ARM64.ActiveCfg = Release|Any CPU
{A678BCA5-03DE-71E4-73C1-388B7550E4E3}.Release|ARM64.Build.0 = Release|Any CPU
{A678BCA5-03DE-71E4-73C1-388B7550E4E3}.Release|x64.ActiveCfg = Release|Any CPU
{A678BCA5-03DE-71E4-73C1-388B7550E4E3}.Release|x64.Build.0 = Release|Any CPU
{A678BCA5-03DE-71E4-73C1-388B7550E4E3}.Release|x86.ActiveCfg = Release|Any CPU
{A678BCA5-03DE-71E4-73C1-388B7550E4E3}.Release|x86.Build.0 = Release|Any CPU
{8F2FE667-2D91-428E-0630-05E6330F9625}.Debug|ARM64.ActiveCfg = Debug|Any CPU
{8F2FE667-2D91-428E-0630-05E6330F9625}.Debug|ARM64.Build.0 = Debug|Any CPU
{8F2FE667-2D91-428E-0630-05E6330F9625}.Debug|x64.ActiveCfg = Debug|Any CPU
{8F2FE667-2D91-428E-0630-05E6330F9625}.Debug|x64.Build.0 = Debug|Any CPU
{8F2FE667-2D91-428E-0630-05E6330F9625}.Debug|x86.ActiveCfg = Debug|Any CPU
{8F2FE667-2D91-428E-0630-05E6330F9625}.Debug|x86.Build.0 = Debug|Any CPU
{8F2FE667-2D91-428E-0630-05E6330F9625}.Release|ARM64.ActiveCfg = Release|Any CPU
{8F2FE667-2D91-428E-0630-05E6330F9625}.Release|ARM64.Build.0 = Release|Any CPU
{8F2FE667-2D91-428E-0630-05E6330F9625}.Release|x64.ActiveCfg = Release|Any CPU
{8F2FE667-2D91-428E-0630-05E6330F9625}.Release|x64.Build.0 = Release|Any CPU
{8F2FE667-2D91-428E-0630-05E6330F9625}.Release|x86.ActiveCfg = Release|Any CPU
{8F2FE667-2D91-428E-0630-05E6330F9625}.Release|x86.Build.0 = Release|Any CPU
{0F47FE6F-D0AA-49E5-8F33-78DFDEB1F810}.Debug|ARM64.ActiveCfg = Debug|Any CPU
{0F47FE6F-D0AA-49E5-8F33-78DFDEB1F810}.Debug|ARM64.Build.0 = Debug|Any CPU
{0F47FE6F-D0AA-49E5-8F33-78DFDEB1F810}.Debug|x64.ActiveCfg = Debug|Any CPU
{0F47FE6F-D0AA-49E5-8F33-78DFDEB1F810}.Debug|x64.Build.0 = Debug|Any CPU
{0F47FE6F-D0AA-49E5-8F33-78DFDEB1F810}.Debug|x86.ActiveCfg = Debug|Any CPU
{0F47FE6F-D0AA-49E5-8F33-78DFDEB1F810}.Debug|x86.Build.0 = Debug|Any CPU
{0F47FE6F-D0AA-49E5-8F33-78DFDEB1F810}.Release|ARM64.ActiveCfg = Release|Any CPU
{0F47FE6F-D0AA-49E5-8F33-78DFDEB1F810}.Release|ARM64.Build.0 = Release|Any CPU
{0F47FE6F-D0AA-49E5-8F33-78DFDEB1F810}.Release|x64.ActiveCfg = Release|Any CPU
{0F47FE6F-D0AA-49E5-8F33-78DFDEB1F810}.Release|x64.Build.0 = Release|Any CPU
{0F47FE6F-D0AA-49E5-8F33-78DFDEB1F810}.Release|x86.ActiveCfg = Release|Any CPU
{0F47FE6F-D0AA-49E5-8F33-78DFDEB1F810}.Release|x86.Build.0 = Release|Any CPU
{DD2D477F-94CD-4D4B-8B59-C127F2850E34}.Debug|ARM64.ActiveCfg = Debug|Any CPU
{DD2D477F-94CD-4D4B-8B59-C127F2850E34}.Debug|ARM64.Build.0 = Debug|Any CPU
{DD2D477F-94CD-4D4B-8B59-C127F2850E34}.Debug|x64.ActiveCfg = Debug|Any CPU
{DD2D477F-94CD-4D4B-8B59-C127F2850E34}.Debug|x64.Build.0 = Debug|Any CPU
{DD2D477F-94CD-4D4B-8B59-C127F2850E34}.Debug|x86.ActiveCfg = Debug|Any CPU
{DD2D477F-94CD-4D4B-8B59-C127F2850E34}.Debug|x86.Build.0 = Debug|Any CPU
{DD2D477F-94CD-4D4B-8B59-C127F2850E34}.Release|ARM64.ActiveCfg = Release|Any CPU
{DD2D477F-94CD-4D4B-8B59-C127F2850E34}.Release|ARM64.Build.0 = Release|Any CPU
{DD2D477F-94CD-4D4B-8B59-C127F2850E34}.Release|x64.ActiveCfg = Release|Any CPU
{DD2D477F-94CD-4D4B-8B59-C127F2850E34}.Release|x64.Build.0 = Release|Any CPU
{DD2D477F-94CD-4D4B-8B59-C127F2850E34}.Release|x86.ActiveCfg = Release|Any CPU
{DD2D477F-94CD-4D4B-8B59-C127F2850E34}.Release|x86.Build.0 = Release|Any CPU
{351807DB-CD63-B939-8071-B1FBFF969569}.Debug|ARM64.ActiveCfg = Debug|Any CPU
{351807DB-CD63-B939-8071-B1FBFF969569}.Debug|ARM64.Build.0 = Debug|Any CPU
{351807DB-CD63-B939-8071-B1FBFF969569}.Debug|x64.ActiveCfg = Debug|Any CPU
{351807DB-CD63-B939-8071-B1FBFF969569}.Debug|x64.Build.0 = Debug|Any CPU
{351807DB-CD63-B939-8071-B1FBFF969569}.Debug|x86.ActiveCfg = Debug|Any CPU
{351807DB-CD63-B939-8071-B1FBFF969569}.Debug|x86.Build.0 = Debug|Any CPU
{351807DB-CD63-B939-8071-B1FBFF969569}.Release|ARM64.ActiveCfg = Release|Any CPU
{351807DB-CD63-B939-8071-B1FBFF969569}.Release|ARM64.Build.0 = Release|Any CPU
{351807DB-CD63-B939-8071-B1FBFF969569}.Release|x64.ActiveCfg = Release|Any CPU
{351807DB-CD63-B939-8071-B1FBFF969569}.Release|x64.Build.0 = Release|Any CPU
{351807DB-CD63-B939-8071-B1FBFF969569}.Release|x86.ActiveCfg = Release|Any CPU
{351807DB-CD63-B939-8071-B1FBFF969569}.Release|x86.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
EndGlobalSection
GlobalSection(ExtensibilityGlobals) = postSolution
SolutionGuid = {0FD73F15-ED69-4DC2-9FD3-A4F03AF172A4}
EndGlobalSection
EndGlobal

21
BetterLyrics.slnx Normal file
View File

@@ -0,0 +1,21 @@
<Solution>
<Configurations>
<Platform Name="ARM64" />
<Platform Name="x64" />
<Platform Name="x86" />
</Configurations>
<Project Path="BetterLyrics.Core/BetterLyrics.Core.csproj" />
<Project Path="BetterLyrics.Plugins.Romaji/BetterLyrics.Plugins.Romaji.csproj" />
<Project Path="BetterLyrics.WinUI3/BetterLyrics.WinUI3 (Package)/BetterLyrics.WinUI3 (Package).wapproj" Type="c7167f0d-bc9f-4e6e-afe1-012c56b48db5">
<Deploy />
</Project>
<Project Path="BetterLyrics.WinUI3/BetterLyrics.WinUI3/BetterLyrics.WinUI3.csproj">
<Platform Solution="*|ARM64" Project="ARM64" />
<Platform Solution="*|x64" Project="x64" />
<Platform Solution="*|x86" Project="x86" />
</Project>
<Project Path="ColorThief.WinUI3/ColorThief.WinUI3.csproj" />
<Project Path="Impressionist/Impressionist/Impressionist.csproj" />
<Project Path="PluginAnalyzer/PluginAnalyzer.csproj" Id="8ee58bf7-807d-486c-8d7d-c00bb9ec2b81" />
<Project Path="RomajiConverter.Core/RomajiConverter.Core.csproj" />
</Solution>

View File

@@ -4,11 +4,6 @@
<TargetPlatformMinVersion>10.0.19041.0</TargetPlatformMinVersion> <TargetPlatformMinVersion>10.0.19041.0</TargetPlatformMinVersion>
<RootNamespace>ColorThief.WinUI3</RootNamespace> <RootNamespace>ColorThief.WinUI3</RootNamespace>
<RuntimeIdentifiers>win-x86;win-x64;win-arm64</RuntimeIdentifiers> <RuntimeIdentifiers>win-x86;win-x64;win-arm64</RuntimeIdentifiers>
<UseWinUI>true</UseWinUI>
</PropertyGroup> </PropertyGroup>
<ItemGroup>
<PackageReference Include="Microsoft.Windows.SDK.BuildTools" Version="10.0.26100.7175" />
<PackageReference Include="Microsoft.WindowsAppSDK" Version="1.8.251106002" />
</ItemGroup>
</Project> </Project>

View File

@@ -0,0 +1,14 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>net10.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Mono.Cecil" Version="0.11.6" />
</ItemGroup>
</Project>

254
PluginAnalyzer/Program.cs Normal file
View File

@@ -0,0 +1,254 @@
using Mono.Cecil;
using System.Text;
using System.Text.RegularExpressions;
using System.Diagnostics;
class Program
{
// Global sets
static HashSet<string> _mergedAssemblies = new HashSet<string>();
static HashSet<string> _mergedSystemTypes = new HashSet<string>();
static string _currentScanDirectory = "";
static void Main(string[] args)
{
// =========================================================
// 🚀 MODE 1: CLI Automation Mode (被 VS 编译调用时)
// =========================================================
if (args.Length > 0)
{
try
{
string scanPath = args[0].Replace("\"", "").Trim();
string targetNs = args.Length > 1 ? args[1] : "BetterLyrics.WinUI3";
string prefix = args.Length > 2 ? args[2] : "Plugin";
// 读取第4个参数作为输出目录如果没传就默认用扫描目录
string outputDir = args.Length > 3 ? args[3].Replace("\"", "").Trim() : scanPath;
Console.WriteLine($"[Analyzer] Scanning: {scanPath}");
Console.WriteLine($"[Analyzer] Output to: {outputDir}");
RunBatch(scanPath, targetNs, prefix, outputDir, silent: true);
}
catch (Exception ex)
{
Console.WriteLine($"[Analyzer] Error: {ex.Message}");
Environment.Exit(1);
}
return;
}
// =========================================================
// 🚀 MODE 2: Interactive Mode (手动双击运行)
// =========================================================
Console.WriteLine("==================================================");
Console.WriteLine(" Plugin Dependency Analyzer (Auto-CLI Ready) ");
Console.WriteLine("==================================================");
while (true)
{
_mergedAssemblies.Clear();
_mergedSystemTypes.Clear();
Console.WriteLine("\n1. Enter Plugin FOLDER path (or 'exit'):");
Console.Write("> ");
string input = Console.ReadLine();
if (string.IsNullOrWhiteSpace(input)) continue;
if (input.Trim().ToLower() == "exit") break;
string path = input.Replace("\"", "").Trim();
if (!Directory.Exists(path)) { Console.WriteLine("[ERROR] Folder not found."); continue; }
Console.WriteLine("2. Enter Namespace (Default: BetterLyrics.WinUI3):");
Console.Write("> ");
string ns = Console.ReadLine().Trim();
if (string.IsNullOrWhiteSpace(ns)) ns = "BetterLyrics.WinUI3";
string prefix = new DirectoryInfo(path).Name;
Console.WriteLine($"3. Enter prefix (Default: {prefix}):");
Console.Write("> ");
string p = Console.ReadLine().Trim();
if (!string.IsNullOrWhiteSpace(p)) prefix = p;
// 👇👇👇【修复点在这里】👇👇👇
// 交互模式下,我们默认把文件生成在 exe 旁边的 AnalyzerOutput 文件夹里
string interactiveOutputDir = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "AnalyzerOutput");
// 传入 interactiveOutputDir 以匹配新的方法签名
RunBatch(path, ns, prefix, interactiveOutputDir, silent: false);
}
}
// ---------------------------------------------------------
// 下面的 RunBatch 和 GenerateFiles 签名已更新支持 outputDir
// ---------------------------------------------------------
static void RunBatch(string scanPath, string ns, string prefix, string outputDir, bool silent)
{
_currentScanDirectory = scanPath;
_mergedAssemblies.Clear();
_mergedSystemTypes.Clear();
ProcessDirectory(scanPath);
// 传递 outputDir
GenerateFiles(prefix, ns, outputDir, silent);
}
static void GenerateFiles(string prefix, string rootNamespace, string outputDir, bool silent)
{
Directory.CreateDirectory(outputDir);
string xmlFileName = $"{prefix}_TrimmerRoots.xml";
string csFileName = $"{prefix}_TrimmingConfig.cs";
// 👇 关键修改:区分 Assembly 名和 Namespace 名
string assemblyName = rootNamespace; // DLL 名字 (例如 BetterLyrics.WinUI3)
string codeNamespace = $"{rootNamespace}.PluginConfigs"; // C# 命名空间 (例如 BetterLyrics.WinUI3.PluginConfigs)
// 类名和全名
string configClassName = $"{prefix.Replace(".", "_").Replace(" ", "_")}_Config";
string fullConfigClassName = $"{codeNamespace}.{configClassName}";
// 路径变量
string xmlPath = Path.Combine(outputDir, xmlFileName);
string csPath = Path.Combine(outputDir, csFileName);
// ==========================================
// 1. Generate XML
// ==========================================
var xmlBuilder = new StringBuilder();
xmlBuilder.AppendLine("");
xmlBuilder.AppendLine("<linker>");
// A. 保护插件依赖
if (_mergedAssemblies.Count > 0)
{
foreach (var asm in _mergedAssemblies.OrderBy(n => n))
xmlBuilder.AppendLine($" <assembly fullname=\"{asm}\" preserve=\"all\" />");
}
// B. 保护生成的 Config 类
// ⚠️ 注意assembly fullname 必须是 rootNamespace (DLL名),而不是 codeNamespace
xmlBuilder.AppendLine($" <assembly fullname=\"{assemblyName}\">");
xmlBuilder.AppendLine($" <type fullname=\"{fullConfigClassName}\" preserve=\"all\" />");
xmlBuilder.AppendLine($" </assembly>");
xmlBuilder.AppendLine("</linker>");
// ==========================================
// 2. Generate C#
// ==========================================
var csBuilder = new StringBuilder();
csBuilder.AppendLine("// Auto-Generated by PluginAnalyzer");
csBuilder.AppendLine("using System.Diagnostics.CodeAnalysis;");
csBuilder.AppendLine("using System.Runtime.CompilerServices;");
csBuilder.AppendLine("");
// 👇 这里使用带后缀的命名空间
csBuilder.AppendLine($"namespace {codeNamespace};");
csBuilder.AppendLine($"internal static class {configClassName}");
csBuilder.AppendLine("{");
foreach (var type in _mergedSystemTypes.OrderBy(n => n))
{
csBuilder.AppendLine($" [DynamicDependency(DynamicallyAccessedMemberTypes.All, typeof({type}))]");
}
csBuilder.AppendLine(" [ModuleInitializer]");
csBuilder.AppendLine(" internal static void Initialize()");
csBuilder.AppendLine(" {");
csBuilder.AppendLine(" // This method runs automatically on startup.");
csBuilder.AppendLine(" }");
csBuilder.AppendLine("}");
// ==========================================
// 3. Write & Notify
// ==========================================
File.WriteAllText(xmlPath, xmlBuilder.ToString());
File.WriteAllText(csPath, csBuilder.ToString());
if (!silent)
{
Console.WriteLine($"[Analyzer] Generated: {xmlFileName}");
Process.Start("explorer.exe", outputDir);
}
else
{
Console.WriteLine($"[Analyzer] Created: {xmlPath}");
Console.WriteLine($"[Analyzer] Created: {csPath}");
}
}
// ---------------------------------------------------------
// Helpers (逻辑保持不变)
// ---------------------------------------------------------
static void ProcessDirectory(string folderPath)
{
var files = Directory.GetFiles(folderPath, "*.dll");
foreach (var file in files)
{
if (!IsHostOrSystemBinary(Path.GetFileName(file))) AnalyzeDll(file);
}
}
static void AnalyzeDll(string path)
{
try
{
var resolver = new DefaultAssemblyResolver();
resolver.AddSearchDirectory(Path.GetDirectoryName(path));
using var assembly = AssemblyDefinition.ReadAssembly(path, new ReaderParameters { AssemblyResolver = resolver });
foreach (var typeRef in assembly.MainModule.GetTypeReferences())
{
if (typeRef.Scope is AssemblyNameReference asmRef && !IsIgnoredDependency(asmRef.Name) && !IsLocalDll(asmRef.Name))
_mergedAssemblies.Add(asmRef.Name);
if (typeRef.FullName.StartsWith("System.") || typeRef.FullName.StartsWith("Microsoft.Win32"))
_mergedSystemTypes.Add(FormatTypeName(typeRef));
}
}
catch { }
}
static bool IsLocalDll(string asmName) => File.Exists(Path.Combine(_currentScanDirectory, asmName + ".dll"));
static bool IsHostOrSystemBinary(string fileName)
{
fileName = fileName.ToLower();
return fileName.StartsWith("betterlyrics.") && !fileName.Contains("plugin") ||
fileName.StartsWith("microsoft.windows") || fileName.StartsWith("winrt.") || fileName.StartsWith("system.");
}
static bool IsIgnoredDependency(string asmName) => asmName.Contains("BetterLyrics") || asmName.Contains("WindowsAppSDK") || asmName.Contains("Microsoft.Windows") || asmName == "netstandard" || asmName == "mscorlib";
static string FormatTypeName(TypeReference type)
{
string name = type.FullName;
// 1. 处理嵌套类型 (Cecil 用 '/'C# 用 '.')
name = name.Replace("/", ".");
// 2. 处理泛型 (核心修复:根据参数数量动态生成逗号)
// List`1 -> List<>
// Dictionary`2 -> Dictionary<,>
// Tuple`3 -> Tuple<,,>
if (name.Contains("`"))
{
name = Regex.Replace(name, @"`(\d+)", match =>
{
int argsCount = int.Parse(match.Groups[1].Value);
// 逗号数量 = 参数数量 - 1
// 比如 1个参数=0个逗号 (<>)
// 比如 2个参数=1个逗号 (<,>)
return "<" + new string(',', Math.Max(0, argsCount - 1)) + ">";
});
}
return name;
}
}

View File

@@ -19,7 +19,6 @@
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<Content Include="RomajiConverter.Core.targets" PackagePath="build/RomajiConverter.Core.targets" />
<None Include="docs\README.md" Pack="true" PackagePath="\" /> <None Include="docs\README.md" Pack="true" PackagePath="\" />
</ItemGroup> </ItemGroup>
</Project> </Project>

View File

@@ -1,13 +0,0 @@
<Project>
<ItemGroup>
<UniDicFiles Include="$(MSBuildThisFileDirectory)\..\contentFiles\any\any\unidic\**\*" />
<CustomizeDict Include="$(MSBuildThisFileDirectory)\..\contentFiles\any\any\customizeDict.txt" />
<VariantFiles Include="$(MSBuildThisFileDirectory)\..\contentFiles\any\any\Variants\**\*" />
</ItemGroup>
<Target Name="CopyFiles" BeforeTargets="Build">
<Copy SourceFiles="@(UniDicFiles)" DestinationFolder="$(TargetDir)unidic\%(RecursiveDir)" />
<Copy SourceFiles="@(CustomizeDict)" DestinationFolder="$(TargetDir)" />
<Copy SourceFiles="@(VariantFiles)" DestinationFolder="$(TargetDir)Variants\%(RecursiveDir)" />
</Target>
</Project>