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)种
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+@code {
+
+ bool loading = false;
+
+ [Parameter]
+ public string Name { get; set; }
+
+ [SupplyParameterFromForm]
+ LocaleResourceModel model { get; set; } = default!;
+ Form editform = null!;
+
+ List ResourceItems = new();
+ List languages = new();
+
+ bool modalVisible = false;
+
+ protected override void OnInitialized()
+ {
+ model ??= new LocaleResourceModel() { };
+ base.OnInitialized();
+ }
+
+ protected override async Task OnParametersSetAsync()
+ {
+ _ = LoadLanguages();
+ _ = LoadList();
+ }
+
+ private async Task LoadLanguages()
+ {
+ var url = $"/api/language/enabled";
+ var apiResult = await HttpService.Get>>(url);
+ if (apiResult.Success)
+ {
+ if (apiResult.Data != null)
+ {
+ languages = apiResult.Data;
+ StateHasChanged();
+ }
+ }
+ }
+
+ private async Task LoadList()
+ {
+ loading = true;
+
+ var url = $"/api/localeresource/{Name}";
+
+ var apiResult = await HttpService.Get>>(url);
+ if (apiResult.Success)
+ {
+ if (apiResult.Data != null)
+ {
+ ResourceItems = apiResult.Data;
+ }
+ }
+
+ loading = false;
+ StateHasChanged();
+ }
+
+ void OnCreateClick()
+ {
+ Console.WriteLine("OnCreateClick");
+ model = new() { Name = Name };
+ modalVisible = true;
+ }
+
+ void OnEditClick(LocaleResourceItem data)
+ {
+ this.model = data.Adapt();
+ modalVisible = true;
+ }
+
+ async Task HandleDeleteConfirmAsync(MouseEventArgs e, long id)
+ {
+ var url = $"/api/localeresource/delete/{id}";
+ var apiResult = await HttpService.Post>(url, new());
+ if (apiResult.Success)
+ {
+ _ = LoadList();
+ await ModalService.InfoAsync(new ConfirmOptions() { Title = "操作提示", Content = "删除数据成功" });
+ }
+ else
+ {
+ await ModalService.ErrorAsync(new ConfirmOptions() { Title = "操作提示", Content = $"数据删除失败.{apiResult.Message}" });
+ }
+ }
+
+
+ void HandleModalOk()
+ {
+ editform.Submit();
+ }
+
+ async Task OnFormFinish()
+ {
+ if (editform.Validate())
+ {
+ var result = new ApiResult();
+
+ var url = $"api/localeresource/save";
+ result = await HttpService.Post>(url, model);
+
+ if (result.Success)
+ {
+ modalVisible = false;
+ _ = LoadList();
+ }
+ else
+ {
+ await ModalService.ErrorAsync(new ConfirmOptions() { Title = "服务异常", Content = result.Message });
+ }
+ }
+ }
+
+ void HandleCancel()
+ {
+ modalVisible = false;
+ }
+}
diff --git a/Atomx.Admin/Atomx.Admin.Client/Pages/Systems/LocaleResourceList.razor b/Atomx.Admin/Atomx.Admin.Client/Pages/Systems/LocaleResourceList.razor
index 6c21fb1..85540de 100644
--- a/Atomx.Admin/Atomx.Admin.Client/Pages/Systems/LocaleResourceList.razor
+++ b/Atomx.Admin/Atomx.Admin.Client/Pages/Systems/LocaleResourceList.razor
@@ -33,7 +33,7 @@
- 多语言列表
+ @(@language.Name)语言资源列表
@@ -45,11 +45,11 @@
-
-
+
+
- 语言资源
+ OnEditClick(context)"> 编辑
@@ -57,7 +57,7 @@