Files
Atomx/Atomx.Admin/Atomx.Admin.Client/Pages/Weather.razor
2025-12-09 03:31:07 +08:00

100 lines
3.3 KiB
Plaintext

@page "/weather"
@page "/{locale}/weather"
@using Microsoft.Extensions.Localization
@inject IStringLocalizer<Weather> L
@inject Atomx.Admin.Client.Services.ILocalizationProvider LocalizationProvider
<PageTitle>@L["weather.title"]</PageTitle>
<h1>@L["weather.title"]</h1>
<p>@L["weather.summary"]</p>
<div style="margin-top:12px; margin-bottom:12px;">
<strong>Quick links:</strong>
<span style="padding-left:10px;"><NavLink href="/account/login">Login</NavLink></span>
<span style="padding-left:10px;"><NavLink href="/counter">Counter</NavLink></span>
</div>
@if (forecasts == null)
{
<p><em>Loading...</em></p>
}
else
{
<table class="table">
<thead>
<tr>
<th>Date</th>
<th aria-label="Temperature in Celsius">@L["weather.temperature"]</th>
<th aria-label="Temperature in Farenheit">Temp. (F)</th>
<th>Summary</th>
</tr>
</thead>
<tbody>
@foreach (var forecast in forecasts)
{
<tr>
<td>@forecast.Date.ToShortDateString()</td>
<td>@forecast.TemperatureC</td>
<td>@forecast.TemperatureF</td>
<td>@forecast.Summary</td>
</tr>
}
</tbody>
</table>
}
@code {
[Parameter]
public string Locale { get; set; } = string.Empty;
private WeatherForecast[]? forecasts;
protected override async Task OnInitializedAsync()
{
if (LocalizationProvider != null)
{
LocalizationProvider.LanguageChanged += OnLanguageChanged;
}
if (OperatingSystem.IsBrowser() && LocalizationProvider != null)
{
try { await LocalizationProvider.LoadCultureAsync(LocalizationProvider.CurrentCulture); } catch { }
}
// Simulate asynchronous loading to demonstrate a loading indicator
await Task.Delay(500);
var startDate = DateOnly.FromDateTime(DateTime.Now);
var summaries = new[] { "Freezing", "Bracing", "Chilly", "Cool", "Mild", "Warm", "Balmy", "Hot", "Sweltering", "Scorching" };
forecasts = Enumerable.Range(1, 5).Select(index => new WeatherForecast
{
Date = startDate.AddDays(index),
TemperatureC = Random.Shared.Next(-20, 55),
Summary = summaries[Random.Shared.Next(summaries.Length)]
}).ToArray();
}
private void OnLanguageChanged(object? s, string c) => _ = InvokeAsync(StateHasChanged);
public void Dispose() { if (LocalizationProvider != null) LocalizationProvider.LanguageChanged -= OnLanguageChanged; }
private class WeatherForecast
{
public DateOnly Date { get; set; }
public int TemperatureC { get; set; }
public string? Summary { get; set; }
public int TemperatureF => 32 + (int)(TemperatureC / 0.5556);
}
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;
}
}