实现多语言切换

This commit is contained in:
2025-12-09 03:31:07 +08:00
parent 9631e00a12
commit 429fb39140
18 changed files with 1173 additions and 41 deletions

View File

@@ -0,0 +1,123 @@
@page "/debug/localization"
@inject Atomx.Admin.Client.Services.ILocalizationProvider LocalizationProvider
@inject IHttpClientFactory HttpClientFactory
@inject IJSRuntime JS
@inject ILogger<DebugLocalization> Logger
@inject HttpClient Http
@inject NavigationManager Nav
<h3>Localization Debug</h3>
<p>CurrentCulture: <b>@LocalizationProvider.CurrentCulture</b></p>
<button @onclick="SetProviderZh">Set culture zh</button>
<button @onclick="SetProviderEn">Set culture en</button>
<button @onclick="FetchFiles">Fetch files via HttpClient</button>
<button @onclick="ReadCookie">Read cookie</button>
<h4>Provider Results</h4>
<ul>
@foreach (var kv in providerResults)
{
<li>@kv</li>
}
</ul>
<h4>HTTP Fetch Results</h4>
<ul>
@foreach (var kv in httpResults)
{
<li>@kv</li>
}
</ul>
<h4>JS Read</h4>
<p>@jsResult</p>
@code {
private List<string> providerResults = new();
private List<string> httpResults = new();
private string jsResult = string.Empty;
private async Task SetProviderZh()
{
providerResults.Clear();
try
{
// Use short code; provider will map to full culture and set active culture
await LocalizationProvider.SetCultureAsync("zh");
providerResults.Add($"Set culture to {LocalizationProvider.CurrentCulture}");
providerResults.Add($"site.name={LocalizationProvider.GetString("site.name")}");
providerResults.Add($"login.title={LocalizationProvider.GetString("login.title")}");
}
catch (Exception ex)
{
providerResults.Add("Set provider zh failed: " + ex.Message);
Logger.LogError(ex, "Set provider zh failed");
}
}
private async Task SetProviderEn()
{
providerResults.Clear();
try
{
await LocalizationProvider.SetCultureAsync("en");
providerResults.Add($"Set culture to {LocalizationProvider.CurrentCulture}");
providerResults.Add($"site.name={LocalizationProvider.GetString("site.name")}");
providerResults.Add($"login.title={LocalizationProvider.GetString("login.title")}");
}
catch (Exception ex)
{
providerResults.Add("Set provider en failed: " + ex.Message);
Logger.LogError(ex, "Set provider en failed");
}
}
private async Task FetchFiles()
{
httpResults.Clear();
try
{
// Prefer injected HttpClient that has BaseAddress set in Program.cs for WASM
var client = Http ?? HttpClientFactory.CreateClient();
var urlZ = new Uri(new Uri(Nav.BaseUri), $"localization/zh-Hans.json");
httpResults.Add($"GET {urlZ}");
var resZ = await client.GetAsync(urlZ);
httpResults.Add($"=> {resZ.StatusCode}");
if (resZ.IsSuccessStatusCode)
{
var txt = await resZ.Content.ReadAsStringAsync();
httpResults.Add("zh content len=" + txt.Length);
}
var urlE = new Uri(new Uri(Nav.BaseUri), $"localization/en-US.json");
httpResults.Add($"GET {urlE}");
var resE = await client.GetAsync(urlE);
httpResults.Add($"=> {resE.StatusCode}");
if (resE.IsSuccessStatusCode)
{
var txt = await resE.Content.ReadAsStringAsync();
httpResults.Add("en content len=" + txt.Length);
}
}
catch (Exception ex)
{
httpResults.Add("Fetch error: " + ex.Message);
Logger.LogError(ex, "FetchFiles error");
}
}
private async Task ReadCookie()
{
try
{
jsResult = await JS.InvokeAsync<string>("CookieReader.Read", "atomx.culture");
}
catch (Exception ex)
{
jsResult = "JS error: " + ex.Message;
}
}
}