From d091bde8c4fbdb0f331e5785d4cdbd181192e802 Mon Sep 17 00:00:00 2001 From: maliming Date: Wed, 18 Dec 2024 16:53:13 +0800 Subject: [PATCH] Ignore `defaultLanguage` if there is only one language. --- ...faultAbpRequestLocalizationOptionsProvider.cs | 16 ++++++++++++---- .../Localization/LocalizationSettingHelper.cs | 14 +++++++++++--- 2 files changed, 23 insertions(+), 7 deletions(-) diff --git a/framework/src/Volo.Abp.AspNetCore/Microsoft/AspNetCore/RequestLocalization/DefaultAbpRequestLocalizationOptionsProvider.cs b/framework/src/Volo.Abp.AspNetCore/Microsoft/AspNetCore/RequestLocalization/DefaultAbpRequestLocalizationOptionsProvider.cs index 35d30e9f64..bd767f93fb 100644 --- a/framework/src/Volo.Abp.AspNetCore/Microsoft/AspNetCore/RequestLocalization/DefaultAbpRequestLocalizationOptionsProvider.cs +++ b/framework/src/Volo.Abp.AspNetCore/Microsoft/AspNetCore/RequestLocalization/DefaultAbpRequestLocalizationOptionsProvider.cs @@ -4,6 +4,7 @@ using System.Globalization; using System.Linq; using System.Threading; using System.Threading.Tasks; +using DeviceDetectorNET; using Microsoft.AspNetCore.Builder; using Microsoft.AspNetCore.Localization; using Microsoft.Extensions.DependencyInjection; @@ -57,7 +58,7 @@ public class DefaultAbpRequestLocalizationOptionsProvider : ? new RequestLocalizationOptions() : new RequestLocalizationOptions { - DefaultRequestCulture = DefaultGetRequestCulture(defaultLanguage, languages), + DefaultRequestCulture = GetDefaultRequestCulture(defaultLanguage, languages), SupportedCultures = languages .Select(l => l.CultureName) .Distinct() @@ -87,15 +88,22 @@ public class DefaultAbpRequestLocalizationOptionsProvider : return _requestLocalizationOptions; } - private static RequestCulture DefaultGetRequestCulture(string? defaultLanguage, IReadOnlyList languages) + private static RequestCulture GetDefaultRequestCulture(string? defaultLanguage, IReadOnlyList languages) { if (defaultLanguage == null) { - var firstLanguage = languages.First(); + var firstLanguage = languages.FirstOrDefault() ?? new LanguageInfo("en", "en"); return new RequestCulture(firstLanguage.CultureName, firstLanguage.UiCultureName); } var (cultureName, uiCultureName) = LocalizationSettingHelper.ParseLanguageSetting(defaultLanguage); + + if (languages.Any() && languages.All(l => l.CultureName != cultureName)) + { + var firstLanguage = languages.First(); + return new RequestCulture(firstLanguage.CultureName, firstLanguage.UiCultureName); + } + return new RequestCulture(cultureName, uiCultureName); } @@ -106,4 +114,4 @@ public class DefaultAbpRequestLocalizationOptionsProvider : _requestLocalizationOptions = null; } } -} \ No newline at end of file +} diff --git a/framework/src/Volo.Abp.Localization/Volo/Abp/Localization/LocalizationSettingHelper.cs b/framework/src/Volo.Abp.Localization/Volo/Abp/Localization/LocalizationSettingHelper.cs index e24dd32199..860a0c9d96 100644 --- a/framework/src/Volo.Abp.Localization/Volo/Abp/Localization/LocalizationSettingHelper.cs +++ b/framework/src/Volo.Abp.Localization/Volo/Abp/Localization/LocalizationSettingHelper.cs @@ -8,17 +8,25 @@ public static class LocalizationSettingHelper /// Gets a setting value like "en-US;en" and returns as splitted values like ("en-US", "en"). /// /// + /// /// - public static (string cultureName, string uiCultureName) ParseLanguageSetting([NotNull] string settingValue) + public static (string cultureName, string uiCultureName) ParseLanguageSetting([NotNull] string settingValue, string defaultCultureName = "en") { Check.NotNull(settingValue, nameof(settingValue)); if (!settingValue.Contains(";")) { - return (settingValue, settingValue); + return CultureHelper.IsValidCultureCode(settingValue) + ? (settingValue, settingValue) + : (defaultCultureName, defaultCultureName); } var splitted = settingValue.Split(';'); - return (splitted[0], splitted[1]); + if (splitted.Length == 2 && CultureHelper.IsValidCultureCode(splitted[0]) && CultureHelper.IsValidCultureCode(splitted[1])) + { + return (splitted[0], splitted[1]); + } + + return (defaultCultureName, defaultCultureName); } }