实现多语言切换
This commit is contained in:
@@ -1,18 +1,87 @@
|
||||
@page "/counter"
|
||||
@page "/{locale}/counter"
|
||||
|
||||
<PageTitle>Counter</PageTitle>
|
||||
@using Microsoft.Extensions.Localization
|
||||
@inject IStringLocalizer<Counter> L
|
||||
@inject Atomx.Admin.Client.Services.ILocalizationProvider LocalizationProvider
|
||||
|
||||
<h1>Counter</h1>
|
||||
<PageTitle>@L["site.name"]</PageTitle>
|
||||
|
||||
<p role="status">Current count: @currentCount</p>
|
||||
<h1>@L["site.name"]</h1>
|
||||
|
||||
<button class="btn btn-primary" @onclick="IncrementCount">Click me</button>
|
||||
<p role="status">@(L["current.count"] ?? "Current count"): @currentCount</p>
|
||||
|
||||
<button class="btn btn-primary" @onclick="IncrementCount">@(L["click.me"] ?? "Click me")</button>
|
||||
|
||||
<Atomx.Admin.Client.Components.LangSelector />
|
||||
|
||||
<div style="margin-top:16px;">
|
||||
<strong>Quick links:</strong>
|
||||
<span style="padding-left:10px;"><NavLink href="/account/login">Login</NavLink></span>
|
||||
<span style="padding-left:10px;"><NavLink href="/weather">Weather</NavLink></span>
|
||||
</div>
|
||||
|
||||
<div style="margin-top:16px;">
|
||||
<strong>zh Quick links:</strong>
|
||||
<span style="padding-left:10px;"><NavLink href="/zh/account/login">Login</NavLink></span>
|
||||
<span style="padding-left:10px;"><NavLink href="/zh/weather">Weather</NavLink></span>
|
||||
</div>
|
||||
|
||||
<div style="margin-top:16px;">
|
||||
<strong>en Quick links:</strong>
|
||||
<span style="padding-left:10px;"><NavLink href="/en/account/login">Login</NavLink></span>
|
||||
<span style="padding-left:10px;"><NavLink href="/en/weather">Weather</NavLink></span>
|
||||
</div>
|
||||
|
||||
@code {
|
||||
|
||||
[Parameter]
|
||||
public string Locale { get; set; } = string.Empty;
|
||||
|
||||
private int currentCount = 0;
|
||||
|
||||
protected override async Task OnInitializedAsync()
|
||||
{
|
||||
if (LocalizationProvider != null)
|
||||
{
|
||||
LocalizationProvider.LanguageChanged += OnLanguageChanged;
|
||||
}
|
||||
|
||||
// If running in browser, ensure current culture loaded (WASM loads asynchronously)
|
||||
if (OperatingSystem.IsBrowser() && LocalizationProvider != null)
|
||||
{
|
||||
try
|
||||
{
|
||||
await LocalizationProvider.LoadCultureAsync(LocalizationProvider.CurrentCulture);
|
||||
}
|
||||
catch { }
|
||||
}
|
||||
}
|
||||
|
||||
private void OnLanguageChanged(object? sender, string culture)
|
||||
{
|
||||
_ = InvokeAsync(StateHasChanged);
|
||||
}
|
||||
|
||||
public void Dispose()
|
||||
{
|
||||
if (LocalizationProvider != null)
|
||||
{
|
||||
LocalizationProvider.LanguageChanged -= OnLanguageChanged;
|
||||
}
|
||||
}
|
||||
|
||||
private void IncrementCount()
|
||||
{
|
||||
currentCount++;
|
||||
}
|
||||
|
||||
private string GetShortCulture(string current)
|
||||
{
|
||||
if (string.IsNullOrEmpty(current)) return current;
|
||||
if (current.StartsWith("zh", StringComparison.OrdinalIgnoreCase)) return "zh";
|
||||
if (current.StartsWith("en", StringComparison.OrdinalIgnoreCase)) return "en";
|
||||
var prefix = current.Split('-', StringSplitOptions.RemoveEmptyEntries).FirstOrDefault();
|
||||
return prefix ?? current;
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user