mirror of
https://github.com/jayfunc/BetterLyrics.git
synced 2026-01-12 19:24:55 +08:00
- 将 `Package.appxmanifest` 的版本号更新为 `1.0.71.0`。 - 移除 `BetterLyrics.WinUI3.csproj` 中对 `TinyPinyin.Net` 的引用。 - 在 `PlaybackSettingsControl.xaml` 中更新目标语言选择,移除中文选项并添加多个新语言。 - 新增 Apple Music 令牌输入框和按钮,允许用户保存令牌。 - 在 `LyricsSearchProviderToDisplayNameConverter.cs` 和 `TranslationSearchProviderToDisplayNameConverter.cs` 中添加对 Apple Music 的支持。 - 在 `LyricsSearchProvider.cs` 中新增 `AppleMusic` 作为歌词搜索提供者,并添加相关缓存目录和格式。 - 更新 `LanguageHelper.cs` 中的目标语言列表。 - 将 `TranslationSettings.cs` 中的 `SelectedTargetLanguageIndex` 属性更改为 `SelectedTargetLanguageCode`。 - 在 `LyricsSearchService.cs` 中添加 Apple Music 的歌词搜索功能。 - 更新 `MediaSessionsService.cs` 中的翻译和歌词更新逻辑。 - 移除 `SettingsPageViewModel.cs` 中的库信息支持,添加对媒体会话服务的引用。 - 新增 `AppleMusic.cs` 文件,包含与 Apple Music API 交互的逻辑。
152 lines
5.2 KiB
C#
152 lines
5.2 KiB
C#
using BetterLyrics.WinUI3.Helper;
|
|
using NTextCat;
|
|
using System.Collections.Generic;
|
|
using System.Linq;
|
|
using Windows.Globalization;
|
|
|
|
namespace BetterLyrics.WinUI3.Services
|
|
{
|
|
public class LanguageHelper
|
|
{
|
|
private static readonly RankedLanguageIdentifierFactory _factory = new();
|
|
private static readonly RankedLanguageIdentifier _identifier;
|
|
|
|
public static List<Models.LanguageInfo> SupportedTargetLanguages { get; set; } =
|
|
[
|
|
new Models.LanguageInfo("ar", "العربية"),
|
|
new Models.LanguageInfo("az", "Azərbaycan dili"),
|
|
|
|
new Models.LanguageInfo("bg", "Български"),
|
|
new Models.LanguageInfo("bn", "বাংলা"),
|
|
|
|
new Models.LanguageInfo("ca", "Català"),
|
|
new Models.LanguageInfo("cs", "Čeština"),
|
|
|
|
new Models.LanguageInfo("da", "Dansk"),
|
|
new Models.LanguageInfo("de", "Deutsch"),
|
|
|
|
new Models.LanguageInfo("el", "Ελληνικά"),
|
|
new Models.LanguageInfo("en", "English"),
|
|
new Models.LanguageInfo("eo", "Esperanto"),
|
|
new Models.LanguageInfo("es", "Español"),
|
|
new Models.LanguageInfo("et", "Eesti"),
|
|
new Models.LanguageInfo("eu", "Euskara"),
|
|
|
|
new Models.LanguageInfo("fa", "فارسی"),
|
|
new Models.LanguageInfo("fi", "Suomi"),
|
|
new Models.LanguageInfo("fr", "Français"),
|
|
|
|
new Models.LanguageInfo("ga", "Gaeilge"),
|
|
new Models.LanguageInfo("gl", "Galego"),
|
|
|
|
new Models.LanguageInfo("he", "עברית"),
|
|
new Models.LanguageInfo("hi", "हिन्दी"),
|
|
new Models.LanguageInfo("hu", "Magyar"),
|
|
|
|
new Models.LanguageInfo("id", "Bahasa Indonesia"),
|
|
new Models.LanguageInfo("it", "Italiano"),
|
|
|
|
new Models.LanguageInfo("ja", "日本語"),
|
|
|
|
new Models.LanguageInfo("ko", "한국어"),
|
|
new Models.LanguageInfo("ky", "Кыргызча"),
|
|
|
|
new Models.LanguageInfo("lt", "Lietuvių"),
|
|
new Models.LanguageInfo("lv", "Latviešu"),
|
|
|
|
new Models.LanguageInfo("ms", "Bahasa Melayu"),
|
|
|
|
new Models.LanguageInfo("nb", "Norsk bokmål"),
|
|
new Models.LanguageInfo("nl", "Nederlands"),
|
|
|
|
new Models.LanguageInfo("pt-BR", "Português (Brasil)"),
|
|
new Models.LanguageInfo("pl", "Polski"),
|
|
new Models.LanguageInfo("pt", "Português"),
|
|
|
|
new Models.LanguageInfo("ro", "Română"),
|
|
new Models.LanguageInfo("ru", "Русский"),
|
|
|
|
new Models.LanguageInfo("sk", "Slovenčina"),
|
|
new Models.LanguageInfo("sl", "Slovenščina"),
|
|
new Models.LanguageInfo("sq", "Shqip"),
|
|
new Models.LanguageInfo("sr", "Српски"),
|
|
new Models.LanguageInfo("sv", "Svenska"),
|
|
|
|
new Models.LanguageInfo("th", "ไทย"),
|
|
new Models.LanguageInfo("tl", "Filipino"),
|
|
new Models.LanguageInfo("tr", "Türkçe"),
|
|
|
|
new Models.LanguageInfo("uk", "Українська"),
|
|
new Models.LanguageInfo("ur", "اردو"),
|
|
|
|
new Models.LanguageInfo("vi", "Tiếng Việt"),
|
|
|
|
new Models.LanguageInfo("zh", "中文"),
|
|
];
|
|
|
|
static LanguageHelper()
|
|
{
|
|
_identifier = _factory.Load(PathHelper.LanguageProfilePath);
|
|
RomajiConverter.Core.Helpers.RomajiHelper.Init();
|
|
}
|
|
|
|
public static string? DetectLanguageCode(string? text)
|
|
{
|
|
if (text == null) return null;
|
|
|
|
var guessList = _identifier.Identify(text);
|
|
string? code = guessList?.FirstOrDefault()?.Item1.Iso639_2T;
|
|
code = code switch
|
|
{
|
|
"simple" => "en",
|
|
"zh_classical" => "zh",
|
|
"zh_yue" => "zh",
|
|
_ => code
|
|
};
|
|
return code;
|
|
}
|
|
|
|
public static bool IsCJK(string text)
|
|
{
|
|
return DetectLanguageCode(text)?.Substring(0, 2) switch
|
|
{
|
|
"zh" or "ja" or "ko" => true,
|
|
_ => false
|
|
};
|
|
}
|
|
|
|
public static string GetDefaultTargetLanguageCode()
|
|
{
|
|
var found = SupportedTargetLanguages.Find(x => ApplicationLanguages.Languages.FirstOrDefault()?.Contains(x.Code) == true);
|
|
if (found == null)
|
|
{
|
|
return "en";
|
|
}
|
|
else
|
|
{
|
|
return found.Code;
|
|
}
|
|
}
|
|
|
|
public static string GetOrderChar(string text)
|
|
{
|
|
if (string.IsNullOrWhiteSpace(text)) return "#";
|
|
char c = text.ElementAtOrDefault(0);
|
|
if (char.IsLetter(c) && c < 128)
|
|
return char.ToUpper(c).ToString();
|
|
|
|
if (Pinyin.Pinyin.Instance.IsHanzi(c.ToString()))
|
|
{
|
|
return Pinyin.Pinyin.Instance.HanziToPinyin(c.ToString(), Pinyin.ManTone.Style.NORMAL).ToStr().ToUpper().FirstOrDefault().ToString();
|
|
}
|
|
|
|
return "#";
|
|
}
|
|
|
|
public static string ToRomaji(string text)
|
|
{
|
|
return string.Join(" ", RomajiConverter.Core.Helpers.RomajiHelper.SentenceToRomaji(text).Select(x => x.Romaji));
|
|
}
|
|
}
|
|
}
|