From 8aca372fc176c347c8b6aba2ea620cd166d2718a Mon Sep 17 00:00:00 2001 From: Seany <17074267@qq.com> Date: Sat, 6 Dec 2025 13:30:17 +0800 Subject: [PATCH] chore fix --- .../Components/CultureSelector.razor | 29 -- .../Components/LanguageSelector.razor | 61 ++++ .../Components/LocalizedText.razor | 26 -- .../Models/LocaleResourceItem.cs | 17 + .../Models/LocaleResourceModel.cs | 5 + .../Atomx.Admin.Client/Pages/Login.razor | 5 + .../Pages/Systems/LocaleResourceDetail.razor | 207 +++++++++++ .../Pages/Systems/LocaleResourceList.razor | 106 +++--- Atomx.Admin/Atomx.Admin.Client/Program.cs | 21 +- .../Services/JsonStringLocalizer.cs | 141 ++++++++ .../Services/JsonStringLocalizerFactory.cs | 27 ++ .../Services/LanguageProvider.cs | 129 +++++++ .../Services/LocalizationClientService.cs | 322 ------------------ .../Utils/LocalizedComponentBase.cs | 31 ++ Atomx.Admin/Atomx.Admin.Client/_Imports.razor | 4 +- .../Atomx.Admin.Client/wwwroot/js/language.js | 9 + Atomx.Admin/Atomx.Admin/Atomx.Admin.csproj | 14 +- Atomx.Admin/Atomx.Admin/Components/App.razor | 9 +- .../Controllers/AddressController.cs | 2 +- .../Controllers/AdminController.cs | 2 +- .../Controllers/AppVersionController.cs | 2 +- .../Controllers/CategoryController.cs | 2 +- .../Controllers/LanguageController.cs | 9 +- .../Controllers/LocaleResourceController.cs | 61 +++- .../Atomx.Admin/Controllers/MenuController.cs | 2 +- .../Controllers/MessageTemplateController.cs | 2 +- .../Controllers/ProductAttributeController.cs | 2 +- .../ProductAttributeOptionController.cs | 2 +- .../Controllers/ProductController.cs | 30 +- .../Controllers/SiteAppController.cs | 2 +- .../SpecificationAttributeController.cs | 2 +- .../SpecificationAttributeOptionController.cs | 2 +- .../Controllers/UploadFileController.cs | 2 +- .../Extensions/DbMigrateExtension.cs | 72 ++-- .../Atomx.Admin/Localization/en-US.json | 3 + .../Atomx.Admin/Localization/zh-Hans.json | 3 + .../Middlewares/CultureMiddleware.cs | 48 +++ Atomx.Admin/Atomx.Admin/Program.cs | 60 +++- .../Services/LocalizationService.cs | 70 ---- .../Atomx.Admin/Services/PermissionService.cs | 3 - ...RevalidatingAuthenticationStateProvider.cs | 27 +- .../CacheServices/LanguageCacheService.cs | 2 +- Atomx.Data/Services/IdCreatorService.cs | 4 +- 43 files changed, 984 insertions(+), 595 deletions(-) delete mode 100644 Atomx.Admin/Atomx.Admin.Client/Components/CultureSelector.razor create mode 100644 Atomx.Admin/Atomx.Admin.Client/Components/LanguageSelector.razor delete mode 100644 Atomx.Admin/Atomx.Admin.Client/Components/LocalizedText.razor create mode 100644 Atomx.Admin/Atomx.Admin.Client/Models/LocaleResourceItem.cs create mode 100644 Atomx.Admin/Atomx.Admin.Client/Pages/Systems/LocaleResourceDetail.razor create mode 100644 Atomx.Admin/Atomx.Admin.Client/Services/JsonStringLocalizer.cs create mode 100644 Atomx.Admin/Atomx.Admin.Client/Services/JsonStringLocalizerFactory.cs create mode 100644 Atomx.Admin/Atomx.Admin.Client/Services/LanguageProvider.cs delete mode 100644 Atomx.Admin/Atomx.Admin.Client/Services/LocalizationClientService.cs create mode 100644 Atomx.Admin/Atomx.Admin.Client/Utils/LocalizedComponentBase.cs create mode 100644 Atomx.Admin/Atomx.Admin.Client/wwwroot/js/language.js create mode 100644 Atomx.Admin/Atomx.Admin/Localization/en-US.json create mode 100644 Atomx.Admin/Atomx.Admin/Localization/zh-Hans.json create mode 100644 Atomx.Admin/Atomx.Admin/Middlewares/CultureMiddleware.cs delete mode 100644 Atomx.Admin/Atomx.Admin/Services/LocalizationService.cs diff --git a/Atomx.Admin/Atomx.Admin.Client/Components/CultureSelector.razor b/Atomx.Admin/Atomx.Admin.Client/Components/CultureSelector.razor deleted file mode 100644 index da084a0..0000000 --- a/Atomx.Admin/Atomx.Admin.Client/Components/CultureSelector.razor +++ /dev/null @@ -1,29 +0,0 @@ -@inject IJSRuntime JSRuntime -@inject ILocalizationService LocalizationService -@inject NavigationManager Navigation - -@* *@ - -@code { - private string _selectedCulture = "en-US"; - - protected override async Task OnInitializedAsync() - { - _selectedCulture = await JSRuntime.InvokeAsync("blazorCulture.get") ?? "en-US"; - } - - private async Task OnCultureChanged(ChangeEventArgs e) - { - var culture = e.Value?.ToString(); - if (!string.IsNullOrEmpty(culture)) - { - await JSRuntime.InvokeVoidAsync("blazorCulture.set", culture); - await LocalizationService.LoadResourcesAsync(culture); - Navigation.NavigateTo(Navigation.Uri, forceLoad: true); - } - } -} \ No newline at end of file diff --git a/Atomx.Admin/Atomx.Admin.Client/Components/LanguageSelector.razor b/Atomx.Admin/Atomx.Admin.Client/Components/LanguageSelector.razor new file mode 100644 index 0000000..686d8df --- /dev/null +++ b/Atomx.Admin/Atomx.Admin.Client/Components/LanguageSelector.razor @@ -0,0 +1,61 @@ +@inject LanguageProvider LanguageProvider +@inject IStringLocalizer Localizer + + + +@code { + protected override void OnInitialized() + { + // 订阅变更以便在语言切换时即时更新该组件 + LanguageProvider.OnLanguageChanged += OnLanguageChanged; + } + + private void OnLanguageChanged() + { + // 在 UI 线程上下文中触发 StateHasChanged + _ = InvokeAsync(StateHasChanged); + } + + public void Dispose() + { + LanguageProvider.OnLanguageChanged -= OnLanguageChanged; + } + + private string GetLanguageDisplayName(string languageCode) + { + return languageCode switch + { + "zh-Hans" => "简体中文", + "en-US" => "English (US)", + _ => languageCode + }; + } + + private async Task ChangeLanguage(string languageCode) + { + await LanguageProvider.ChangeLanguageAsync(languageCode); + } +} \ No newline at end of file diff --git a/Atomx.Admin/Atomx.Admin.Client/Components/LocalizedText.razor b/Atomx.Admin/Atomx.Admin.Client/Components/LocalizedText.razor deleted file mode 100644 index 7aaea5a..0000000 --- a/Atomx.Admin/Atomx.Admin.Client/Components/LocalizedText.razor +++ /dev/null @@ -1,26 +0,0 @@ -@inject ILocalizationService LocalizationService - -@Text - -@code { - private string? _text; - - [Parameter] - public string Key { get; set; } = string.Empty; - - [Parameter] - public string? Culture { get; set; } - - private string Text => _text ?? Key; - - protected override async Task OnParametersSetAsync() - { - await LoadText(); - } - - private async Task LoadText() - { - _text = await LocalizationService.GetStringAsync(Key, Culture) ?? Key; - StateHasChanged(); - } -} \ No newline at end of file diff --git a/Atomx.Admin/Atomx.Admin.Client/Models/LocaleResourceItem.cs b/Atomx.Admin/Atomx.Admin.Client/Models/LocaleResourceItem.cs new file mode 100644 index 0000000..19e010b --- /dev/null +++ b/Atomx.Admin/Atomx.Admin.Client/Models/LocaleResourceItem.cs @@ -0,0 +1,17 @@ +using Atomx.Common.Entities; + +namespace Atomx.Admin.Client.Models +{ + public class LocaleResourceItem:LocaleResource + { + /// + /// 语言标题 + /// + public string Title { get; set; } = string.Empty; + + /// + /// 语言名称 + /// + public string Culture { get; set; } = string.Empty; + } +} diff --git a/Atomx.Admin/Atomx.Admin.Client/Models/LocaleResourceModel.cs b/Atomx.Admin/Atomx.Admin.Client/Models/LocaleResourceModel.cs index 2ea1ce8..31619d7 100644 --- a/Atomx.Admin/Atomx.Admin.Client/Models/LocaleResourceModel.cs +++ b/Atomx.Admin/Atomx.Admin.Client/Models/LocaleResourceModel.cs @@ -12,6 +12,11 @@ /// public int LanguageId { get; set; } + /// + /// 语言标题 + /// + public string Title { get; set; } = string.Empty; + /// /// 语言名称 /// diff --git a/Atomx.Admin/Atomx.Admin.Client/Pages/Login.razor b/Atomx.Admin/Atomx.Admin.Client/Pages/Login.razor index 4879066..922d01a 100644 --- a/Atomx.Admin/Atomx.Admin.Client/Pages/Login.razor +++ b/Atomx.Admin/Atomx.Admin.Client/Pages/Login.razor @@ -3,6 +3,7 @@ @layout EmptyLayout @inject ILogger Logger @inject IJSRuntime JS +@inject IStringLocalizer Localizer 登录 @@ -12,6 +13,10 @@ } else { + +

+ @LanguageProvider.CurrentLanguage 网站名称 @Localizer["site.name"] +

diff --git a/Atomx.Admin/Atomx.Admin.Client/Pages/Systems/LocaleResourceDetail.razor b/Atomx.Admin/Atomx.Admin.Client/Pages/Systems/LocaleResourceDetail.razor new file mode 100644 index 0000000..a0c2f40 --- /dev/null +++ b/Atomx.Admin/Atomx.Admin.Client/Pages/Systems/LocaleResourceDetail.razor @@ -0,0 +1,207 @@ +@page "/system/locale/resource/detail/{Name}" +@inject ILogger Logger +@attribute [Authorize] + + +本地化语言资源 +多语言本地资源管理 + + + + + + @(@Name)多语言资源列表,可用语言@(@languages.Count)种 +
+ +
+
+
+ + + + + + + + + + + + + + + + + + 编辑 + + + + + 删除 + + + + + + + + + + + + + + +
+
+
+ + +
+ + + @if (context.Id == 0) + { + + } + else + { + + } + + + + + + +