chore fix
This commit is contained in:
129
Atomx.Admin/Atomx.Admin.Client/Services/LanguageProvider.cs
Normal file
129
Atomx.Admin/Atomx.Admin.Client/Services/LanguageProvider.cs
Normal file
@@ -0,0 +1,129 @@
|
||||
using Microsoft.AspNetCore.Components;
|
||||
using Microsoft.JSInterop;
|
||||
using System.Globalization;
|
||||
|
||||
namespace Atomx.Admin.Client.Services
|
||||
{
|
||||
/// <summary>
|
||||
/// 语言提供者服务
|
||||
/// </summary>
|
||||
public class LanguageProvider
|
||||
{
|
||||
private readonly IJSRuntime _jsRuntime;
|
||||
private readonly NavigationManager _navigationManager;
|
||||
private string _currentLanguage = "zh-Hans";
|
||||
|
||||
public event Action? OnLanguageChanged;
|
||||
|
||||
public LanguageProvider(IJSRuntime jsRuntime, NavigationManager navigationManager)
|
||||
{
|
||||
_jsRuntime = jsRuntime;
|
||||
_navigationManager = navigationManager;
|
||||
}
|
||||
|
||||
public string CurrentLanguage
|
||||
{
|
||||
get => _currentLanguage;
|
||||
private set
|
||||
{
|
||||
if (_currentLanguage != value)
|
||||
{
|
||||
_currentLanguage = value;
|
||||
|
||||
// 设置全局线程文化,确保 IStringLocalizer 等在随后的渲染中读取到新文化
|
||||
try
|
||||
{
|
||||
var ci = new CultureInfo(value);
|
||||
CultureInfo.DefaultThreadCurrentCulture = ci;
|
||||
CultureInfo.DefaultThreadCurrentUICulture = ci;
|
||||
}
|
||||
catch
|
||||
{
|
||||
// 忽略无效 culture 字符串
|
||||
}
|
||||
|
||||
OnLanguageChanged?.Invoke();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public List<string> SupportedLanguages { get; } = new()
|
||||
{
|
||||
"zh-Hans", // 简体中文
|
||||
"en-US" // 英文(美国)
|
||||
};
|
||||
|
||||
/// <summary>
|
||||
/// 初始化语言
|
||||
/// </summary>
|
||||
public async Task InitializeAsync()
|
||||
{
|
||||
// 尝试从本地存储获取保存的语言
|
||||
try
|
||||
{
|
||||
var savedLanguage = await _jsRuntime.InvokeAsync<string>("localStorage.getItem", "preferred-language");
|
||||
if (!string.IsNullOrEmpty(savedLanguage) && SupportedLanguages.Contains(savedLanguage))
|
||||
{
|
||||
CurrentLanguage = savedLanguage;
|
||||
}
|
||||
else
|
||||
{
|
||||
// 从浏览器获取语言
|
||||
var browserLanguage = await _jsRuntime.InvokeAsync<string>("getBrowserLanguage");
|
||||
CurrentLanguage = GetSupportedLanguage(browserLanguage);
|
||||
}
|
||||
}
|
||||
catch
|
||||
{
|
||||
// JS互操作可能不可用(在预渲染时)
|
||||
CurrentLanguage = "zh-Hans";
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 切换语言
|
||||
/// </summary>
|
||||
public async Task ChangeLanguageAsync(string languageCode)
|
||||
{
|
||||
if (SupportedLanguages.Contains(languageCode) && CurrentLanguage != languageCode)
|
||||
{
|
||||
CurrentLanguage = languageCode;
|
||||
|
||||
// 保存到本地存储
|
||||
try
|
||||
{
|
||||
await _jsRuntime.InvokeVoidAsync("localStorage.setItem", "preferred-language", languageCode);
|
||||
}
|
||||
catch
|
||||
{
|
||||
// 忽略错误
|
||||
}
|
||||
|
||||
// setter 已触发 OnLanguageChanged
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 获取支持的语言
|
||||
/// </summary>
|
||||
private string GetSupportedLanguage(string browserLanguage)
|
||||
{
|
||||
if (string.IsNullOrEmpty(browserLanguage))
|
||||
return "zh-Hans";
|
||||
|
||||
// 检查完全匹配
|
||||
if (SupportedLanguages.Contains(browserLanguage))
|
||||
return browserLanguage;
|
||||
|
||||
// 检查中性语言匹配
|
||||
var neutralLanguage = browserLanguage.Split('-')[0];
|
||||
foreach (var supported in SupportedLanguages)
|
||||
{
|
||||
if (supported.StartsWith(neutralLanguage))
|
||||
return supported;
|
||||
}
|
||||
|
||||
return "zh-Hans"; // 默认语言
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user