diff --git a/src/BootstrapBlazor.Server/BootstrapBlazor.Server.csproj b/src/BootstrapBlazor.Server/BootstrapBlazor.Server.csproj index fa78fb8d6f8..f7a080fcc5d 100644 --- a/src/BootstrapBlazor.Server/BootstrapBlazor.Server.csproj +++ b/src/BootstrapBlazor.Server/BootstrapBlazor.Server.csproj @@ -66,6 +66,7 @@ + diff --git a/src/BootstrapBlazor.Server/Components/Samples/Regions.razor b/src/BootstrapBlazor.Server/Components/Samples/Regions.razor new file mode 100644 index 00000000000..672066d9d88 --- /dev/null +++ b/src/BootstrapBlazor.Server/Components/Samples/Regions.razor @@ -0,0 +1,14 @@ +@page "/region" +@inject IStringLocalizer Localizer + +

@Localizer["RegionTitle"]

+ +

@Localizer["RegionDescription"]

+ + + + + + diff --git a/src/BootstrapBlazor.Server/Components/Samples/Regions.razor.cs b/src/BootstrapBlazor.Server/Components/Samples/Regions.razor.cs new file mode 100644 index 00000000000..7cbe5fd6d81 --- /dev/null +++ b/src/BootstrapBlazor.Server/Components/Samples/Regions.razor.cs @@ -0,0 +1,14 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the Apache 2.0 License +// See the LICENSE file in the project root for more information. +// Maintainer: Argo Zhang(argo@live.ca) Website: https://www.blazor.zone + +namespace BootstrapBlazor.Server.Components.Samples; + +/// +/// 行政区域选择器示例 +/// +public partial class Regions +{ + private string _value = ""; +} diff --git a/src/BootstrapBlazor.Server/Extensions/MenusLocalizerExtensions.cs b/src/BootstrapBlazor.Server/Extensions/MenusLocalizerExtensions.cs index c9125636c8e..fecbb33fd98 100644 --- a/src/BootstrapBlazor.Server/Extensions/MenusLocalizerExtensions.cs +++ b/src/BootstrapBlazor.Server/Extensions/MenusLocalizerExtensions.cs @@ -451,6 +451,12 @@ void AddForm(DemoMenuItem item) Url = "floating-label" }, new() + { + IsNew = true, + Text = Localizer["Region"], + Url = "region" + }, + new() { Text = Localizer["ListGroup"], Url = "list-group" diff --git a/src/BootstrapBlazor.Server/Extensions/ServiceCollectionSharedExtensions.cs b/src/BootstrapBlazor.Server/Extensions/ServiceCollectionSharedExtensions.cs index b23d3171495..14971debe08 100644 --- a/src/BootstrapBlazor.Server/Extensions/ServiceCollectionSharedExtensions.cs +++ b/src/BootstrapBlazor.Server/Extensions/ServiceCollectionSharedExtensions.cs @@ -94,6 +94,9 @@ public static IServiceCollection AddBootstrapBlazorServices(this IServiceCollect // 增加 JuHe 定位服务 services.AddBootstrapBlazorJuHeIpLocatorService(); + // 增加 IRegionService + services.AddBootstrapBlazorRegionService(); + // 增加 PetaPoco ORM 数据服务操作类 // 需要时打开下面代码 //services.AddPetaPoco(option => diff --git a/src/BootstrapBlazor.Server/Locales/en-US.json b/src/BootstrapBlazor.Server/Locales/en-US.json index e115937e170..80661b6c3d2 100644 --- a/src/BootstrapBlazor.Server/Locales/en-US.json +++ b/src/BootstrapBlazor.Server/Locales/en-US.json @@ -4872,7 +4872,8 @@ "OpcDaService": "OpcDaServer", "Navbar": "Navbar", "TaskDashBoard": "TaskDashBoard", - "Dom2ImageService": "IDom2HtmlService" + "Dom2ImageService": "IDom2HtmlService", + "Region": "Region Selector" }, "BootstrapBlazor.Server.Components.Samples.Table.TablesHeader": { "TablesHeaderTitle": "Header grouping function", @@ -7220,5 +7221,11 @@ "Dom2ImageButtonText": "Convert", "Dom2ImageDownloadText": "Download", "Dom2ImageFullText": "Capture" + }, + "BootstrapBlazor.Server.Components.Samples.Regions": { + "RegionTitle": "Region", + "RegionDescription": "A simple region cascade selector, provide 4 levels Chinese administrative division data", + "RegionNormalTitle": "Basic usage", + "RegionNormalIntro": "Use grouping to switch the selection mode for displaying administrative areas" } } diff --git a/src/BootstrapBlazor.Server/Locales/zh-CN.json b/src/BootstrapBlazor.Server/Locales/zh-CN.json index a427eff475c..aee8048bebd 100644 --- a/src/BootstrapBlazor.Server/Locales/zh-CN.json +++ b/src/BootstrapBlazor.Server/Locales/zh-CN.json @@ -4872,7 +4872,8 @@ "OpcDaService": "OpcDaServer 服务", "Navbar": "导航栏 Navbar", "TaskDashBoard": "任务管理器 TaskDashBoard", - "Dom2ImageService": "节点转图片服务 IDom2HtmlService" + "Dom2ImageService": "节点转图片服务 IDom2HtmlService", + "Region": "行政区域选择器 Region" }, "BootstrapBlazor.Server.Components.Samples.Table.TablesHeader": { "TablesHeaderTitle": "表头分组功能", @@ -7220,5 +7221,11 @@ "Dom2ImageButtonText": "转换", "Dom2ImageDownloadText": "下载", "Dom2ImageFullText": "长截图" + }, + "BootstrapBlazor.Server.Components.Samples.Regions": { + "RegionTitle": "Region 行政区域选择器", + "RegionDescription": "提供 4 级行政区划选择器", + "RegionNormalTitle": "基本用法", + "RegionNormalIntro": "使用分组切换显示行政区域的选择模式" } } diff --git a/src/BootstrapBlazor.Server/docs.json b/src/BootstrapBlazor.Server/docs.json index a8dc7c870d7..9da3d392a1f 100644 --- a/src/BootstrapBlazor.Server/docs.json +++ b/src/BootstrapBlazor.Server/docs.json @@ -255,7 +255,8 @@ "navbar": "Navbars", "task-board": "TaskBoard", "modbus-factory": "Modbus\\ModbusFactories", - "serial-port-factory": "SerialPorts\\SerialPortFactories" + "serial-port-factory": "SerialPorts\\SerialPortFactories", + "region": "Regions" }, "video": { "table": "BV1ap4y1x7Qn?p=1", diff --git a/src/BootstrapBlazor/Components/DateTimePicker/PopoverDropdownBase.cs b/src/BootstrapBlazor/Components/DateTimePicker/PopoverDropdownBase.cs index 63ba34323a2..d7042b9a125 100644 --- a/src/BootstrapBlazor/Components/DateTimePicker/PopoverDropdownBase.cs +++ b/src/BootstrapBlazor/Components/DateTimePicker/PopoverDropdownBase.cs @@ -39,6 +39,7 @@ public abstract class PopoverDropdownBase : ValidateBase /// 获得 CustomClass 字符串 /// protected virtual string? CustomClassString => CssBuilder.Default(CustomClass) + .AddClass("popover-region") .AddClass("shadow", ShowShadow) .Build(); } diff --git a/src/BootstrapBlazor/Localization/Json/JsonStringLocalizer.cs b/src/BootstrapBlazor/Localization/Json/JsonStringLocalizer.cs index 90b642d3ded..dec2d53af79 100644 --- a/src/BootstrapBlazor/Localization/Json/JsonStringLocalizer.cs +++ b/src/BootstrapBlazor/Localization/Json/JsonStringLocalizer.cs @@ -107,7 +107,7 @@ public override LocalizedString this[string name] private string? GetStringFromJson(string name) { // get string from json localization file - var localizerStrings = MegerResolveLocalizers(CacheManager.GetAllStringsByTypeName(Assembly, typeName)); + var localizerStrings = MergeResolveLocalizers(CacheManager.GetAllStringsByTypeName(Assembly, typeName)); var cacheKey = $"name={name}&culture={CultureInfo.CurrentUICulture.Name}"; string? ret = null; if (!_missingManifestCache.ContainsKey(cacheKey)) @@ -143,7 +143,7 @@ public override LocalizedString this[string name] if (baseType != type) { var baseAssembly = baseType.Assembly; - var localizerStrings = MegerResolveLocalizers(CacheManager.GetAllStringsByTypeName(baseAssembly, baseType.FullName!)); + var localizerStrings = MergeResolveLocalizers(CacheManager.GetAllStringsByTypeName(baseAssembly, baseType.FullName!)); var l = localizerStrings.Find(i => i.Name == name); if (l is { ResourceNotFound: false }) { @@ -154,7 +154,7 @@ public override LocalizedString this[string name] return ret; } - private List MegerResolveLocalizers(IEnumerable? localizerStrings) + private List MergeResolveLocalizers(IEnumerable? localizerStrings) { var localizers = new List(CacheManager.GetTypeStringsFromResolve(typeName)); if (localizerStrings != null) @@ -174,7 +174,7 @@ private void HandleMissingResourceItem(string name) _missingManifestCache.TryAdd($"name={name}&culture={CultureInfo.CurrentUICulture.Name}", null); } - private List? _allLocalizerdStrings; + private List? _allLocalizedStrings; /// /// 获取当前语言的所有资源信息 @@ -183,15 +183,15 @@ private void HandleMissingResourceItem(string name) /// public override IEnumerable GetAllStrings(bool includeParentCultures) { - if (_allLocalizerdStrings == null) + if (_allLocalizedStrings == null) { var items = GetAllStringsFromService() ?? GetAllStringsFromBase() ?? GetAllStringsFromJson(); - _allLocalizerdStrings = MegerResolveLocalizers(items); + _allLocalizedStrings = MergeResolveLocalizers(items); } - return _allLocalizerdStrings; + return _allLocalizedStrings; // 1. 从注入服务中获取所有资源信息 // get all strings from the other inject service