This commit is contained in:
2025-12-14 02:43:40 +08:00
parent 0741368b44
commit 54e9c7962d
10 changed files with 220 additions and 278 deletions

View File

@@ -13,6 +13,7 @@ namespace Atomx.Admin.Client.Services
private readonly HttpClient _httpClient;
private readonly ILogger<WasmLocalizationProvider> _logger;
private readonly ILocalStorageService _localStorage;
private readonly ILocalizationService _localizationService;
private static readonly ConcurrentDictionary<string, Dictionary<string, string>> _cache = new();
private readonly HashSet<string> _loadingCultures = new();
private string _currentCulture = "zh-Hans";
@@ -21,12 +22,13 @@ namespace Atomx.Admin.Client.Services
private const string LocalizationStorageKey = "Localization_{0}";
private const string LocalizationVersionKey = "LocalizationVersion_{0}";
public WasmLocalizationProvider(IJSRuntime jsRuntime, HttpClient httpClient, ILogger<WasmLocalizationProvider> logger, ILocalStorageService localStorage)
public WasmLocalizationProvider(IJSRuntime jsRuntime, HttpClient httpClient, ILogger<WasmLocalizationProvider> logger, ILocalStorageService localStorage, ILocalizationService localizationService)
{
_jsRuntime = jsRuntime;
_httpClient = httpClient;
_logger = logger;
_localStorage = localStorage;
_localizationService = localizationService;
}
public string CurrentCulture => _currentCulture;
@@ -51,14 +53,43 @@ namespace Atomx.Admin.Client.Services
if (_isInitialized) return;
await LoadCultureAsync(_currentCulture);
// ensure thread cultures and notify localization service
try
{
var ci = new CultureInfo(_currentCulture);
CultureInfo.DefaultThreadCurrentCulture = ci;
CultureInfo.DefaultThreadCurrentUICulture = ci;
_localizationService.SetLanguage(ci);
}
catch (Exception ex)
{
_logger.LogDebug(ex, "Failed to set culture after initialize: {Culture}", _currentCulture);
}
_isInitialized = true;
LanguageChanged?.Invoke(this, _currentCulture);
}
public async Task SetCultureAsync(string cultureShortOrFull)
{
_currentCulture = MapToFullCulture(cultureShortOrFull);
var full = MapToFullCulture(cultureShortOrFull);
_currentCulture = full;
await LoadCultureAsync(_currentCulture);
try
{
var ci = new CultureInfo(_currentCulture);
CultureInfo.DefaultThreadCurrentCulture = ci;
CultureInfo.DefaultThreadCurrentUICulture = ci;
_localizationService.SetLanguage(ci);
}
catch (Exception ex)
{
_logger.LogDebug(ex, "Failed to set culture in SetCultureAsync: {Culture}", _currentCulture);
}
LanguageChanged?.Invoke(this, _currentCulture);
}
@@ -101,6 +132,20 @@ namespace Atomx.Admin.Client.Services
if (cachedVersion == serverVersion && cachedData != null)
{
_logger.LogInformation("Localization data for {Culture} is up-to-date.", cultureFull);
// ensure thread cultures and notify localization service when using cached data
try
{
var ci = new CultureInfo(cultureFull);
CultureInfo.DefaultThreadCurrentCulture = ci;
CultureInfo.DefaultThreadCurrentUICulture = ci;
_localizationService.SetLanguage(ci);
}
catch (Exception ex)
{
_logger.LogDebug(ex, "Failed to set culture after loading from cache: {Culture}", cultureFull);
}
return;
}
@@ -115,6 +160,19 @@ namespace Atomx.Admin.Client.Services
await _localStorage.SetItemAsync(localDataKey, dict);
_logger.LogInformation("Loaded localization file for {Culture} from server and updated local storage.", cultureFull);
// ensure thread cultures and notify localization service after fetching
try
{
var ci = new CultureInfo(cultureFull);
CultureInfo.DefaultThreadCurrentCulture = ci;
CultureInfo.DefaultThreadCurrentUICulture = ci;
_localizationService.SetLanguage(ci);
}
catch (Exception ex)
{
_logger.LogDebug(ex, "Failed to set culture after fetching: {Culture}", cultureFull);
}
}
catch (Exception ex)
{
@@ -127,6 +185,9 @@ namespace Atomx.Admin.Client.Services
_loadingCultures.Remove(cultureFull);
}
}
// Notify listeners that the culture has been loaded
LanguageChanged?.Invoke(this, cultureFull);
}
private string MapToFullCulture(string culture)