diff --git a/src/Snap.Hutao/Snap.Hutao.SourceGeneration/Snap.Hutao.SourceGeneration.csproj b/src/Snap.Hutao/Snap.Hutao.SourceGeneration/Snap.Hutao.SourceGeneration.csproj index a1f0f38a..62f03b54 100644 --- a/src/Snap.Hutao/Snap.Hutao.SourceGeneration/Snap.Hutao.SourceGeneration.csproj +++ b/src/Snap.Hutao/Snap.Hutao.SourceGeneration/Snap.Hutao.SourceGeneration.csproj @@ -7,17 +7,9 @@ enable x64 true - Debug;Release;Debug As Fake Elevated + Debug;Release - - - - - - - - diff --git a/src/Snap.Hutao/Snap.Hutao.Test/Snap.Hutao.Test.csproj b/src/Snap.Hutao/Snap.Hutao.Test/Snap.Hutao.Test.csproj index 96004082..3949e0f1 100644 --- a/src/Snap.Hutao/Snap.Hutao.Test/Snap.Hutao.Test.csproj +++ b/src/Snap.Hutao/Snap.Hutao.Test/Snap.Hutao.Test.csproj @@ -7,7 +7,7 @@ false true True - Debug;Release;Debug As Fake Elevated + Debug;Release diff --git a/src/Snap.Hutao/Snap.Hutao/Resource/Localization/SH.resx b/src/Snap.Hutao/Snap.Hutao/Resource/Localization/SH.resx index 6a5fd97a..882f607f 100644 --- a/src/Snap.Hutao/Snap.Hutao/Resource/Localization/SH.resx +++ b/src/Snap.Hutao/Snap.Hutao/Resource/Localization/SH.resx @@ -932,6 +932,9 @@ 无法找到缓存的元数据文件 + + HTTP {0}:元数据校验文件下载失败 + 元数据服务尚未初始化,或初始化失败 diff --git a/src/Snap.Hutao/Snap.Hutao/Service/Metadata/LocaleNames.cs b/src/Snap.Hutao/Snap.Hutao/Service/Metadata/LocaleNames.cs index e86b1b2f..c760a0df 100644 --- a/src/Snap.Hutao/Snap.Hutao/Service/Metadata/LocaleNames.cs +++ b/src/Snap.Hutao/Snap.Hutao/Service/Metadata/LocaleNames.cs @@ -1,8 +1,6 @@ // Copyright (c) DGP Studio. All rights reserved. // Licensed under the MIT license. -using System.Collections.Immutable; - namespace Snap.Hutao.Service.Metadata; /// @@ -26,42 +24,54 @@ internal static class LocaleNames public const string CHS = "CHS"; // Chinese (Simplified) public const string CHT = "CHT"; // Chinese (Traditional) - public static readonly ImmutableDictionary LanguageNameLocaleNameMap = new Dictionary() + public static bool TryGetLocaleNameFromLanguageName(string languageName, [NotNullWhen(true)] out string? localeName) { - ["de"] = DE, - ["en"] = EN, - ["es"] = ES, - ["fr"] = FR, - ["id"] = ID, - ["it"] = IT, - ["ja"] = JP, - ["ko"] = KR, - ["pt"] = PT, - ["ru"] = RU, - ["th"] = TH, - ["tr"] = TR, - ["vi"] = VI, - ["zh-Hans"] = CHS, - ["zh-Hant"] = CHT, - [string.Empty] = CHS, // Fallback to Chinese. - }.ToImmutableDictionary(); + localeName = languageName switch + { + "de" => DE, + "en" => EN, + "es" => ES, + "fr" => FR, + "id" => ID, + "it" => IT, + "ja" => JP, + "ko" => KR, + "pt" => PT, + "ru" => RU, + "th" => TH, + "tr" => TR, + "vi" => VI, + "zh-Hans" => CHS, + "zh-Hant" => CHT, + "" => CHS, // Fallback to Chinese. + _ => string.Empty, + }; - public static readonly ImmutableDictionary LocaleNameLanguageCodeMap = new Dictionary() + return !string.IsNullOrEmpty(localeName); + } + + public static bool TryGetLanguageCodeFromLocaleName(string localeName, [NotNullWhen(true)] out string? languageCode) { - [DE] = "de-de", - [EN] = "en-us", - [ES] = "es-es", - [FR] = "fr-fr", - [ID] = "id-id", - [IT] = "it-it", - [JP] = "ja-jp", - [KR] = "ko-kr", - [PT] = "pt-pt", - [RU] = "ru-ru", - [TH] = "th-th", - [TR] = "tr-tr", - [VI] = "vi-vn", - [CHS] = "zh-cn", - [CHT] = "zh-tw", - }.ToImmutableDictionary(); + languageCode = localeName switch + { + DE => "de-de", + EN => "en-us", + ES => "es-es", + FR => "fr-fr", + ID => "id-id", + IT => "it-it", + JP => "ja-jp", + KR => "ko-kr", + PT => "pt-pt", + RU => "ru-ru", + TH => "th-th", + TR => "tr-tr", + VI => "vi-vn", + CHS => "zh-cn", + CHT => "zh-tw", + _ => string.Empty, + }; + + return !string.IsNullOrEmpty(languageCode); + } } \ No newline at end of file diff --git a/src/Snap.Hutao/Snap.Hutao/Service/Metadata/MetadataOptions.cs b/src/Snap.Hutao/Snap.Hutao/Service/Metadata/MetadataOptions.cs index 4cc8e4a8..ac89edb7 100644 --- a/src/Snap.Hutao/Snap.Hutao/Service/Metadata/MetadataOptions.cs +++ b/src/Snap.Hutao/Snap.Hutao/Service/Metadata/MetadataOptions.cs @@ -69,7 +69,15 @@ internal sealed partial class MetadataOptions : IOptions /// public string LanguageCode { - get => LocaleNames.LocaleNameLanguageCodeMap[LocaleName]; + get + { + if (LocaleNames.TryGetLanguageCodeFromLocaleName(LocaleName, out string? languageCode)) + { + return languageCode; + } + + throw new KeyNotFoundException($"Invalid localeName: '{LocaleName}'"); + } } /// @@ -84,7 +92,7 @@ internal sealed partial class MetadataOptions : IOptions { while (true) { - if (LocaleNames.LanguageNameLocaleNameMap.TryGetValue(cultureInfo.Name, out string? localeName)) + if (LocaleNames.TryGetLocaleNameFromLanguageName(cultureInfo.Name, out string? localeName)) { return localeName; } diff --git a/src/Snap.Hutao/Snap.Hutao/Service/Metadata/MetadataService.cs b/src/Snap.Hutao/Snap.Hutao/Service/Metadata/MetadataService.cs index 851db7a0..f2c8192e 100644 --- a/src/Snap.Hutao/Snap.Hutao/Service/Metadata/MetadataService.cs +++ b/src/Snap.Hutao/Snap.Hutao/Service/Metadata/MetadataService.cs @@ -9,6 +9,7 @@ using Snap.Hutao.Core.ExceptionService; using Snap.Hutao.Core.IO.Hashing; using Snap.Hutao.Core.Setting; using Snap.Hutao.Service.Notification; +using System.Globalization; using System.IO; using System.Net; using System.Net.Http; @@ -90,13 +91,14 @@ internal sealed partial class MetadataService : IMetadataService, IMetadataServi } catch (HttpRequestException ex) { - if (ex.StatusCode is HttpStatusCode.Forbidden or HttpStatusCode.NotFound) + if (ex.StatusCode is (HttpStatusCode)418) { infoBarService.Error(SH.ServiceMetadataVersionNotSupported); } else { - infoBarService.Error(ex, SH.ServiceMetadataRequestFailed); + int code = (int)(ex.StatusCode ?? 0); + infoBarService.Error(SH.FormatServiceMetadataHttpRequestFailed(CultureInfo.CurrentCulture, code)); } return false;