Files
Atomx/Atomx.Admin/Atomx.Admin.Client/Services/LanguageProvider.cs
2025-12-07 12:41:04 +08:00

120 lines
3.7 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
using Microsoft.AspNetCore.Components;
using Microsoft.JSInterop;
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;
OnLanguageChanged?.Invoke();
}
}
}
public List<string> SupportedLanguages { get; } = new()
{
"zh-Hans", // 简体中文
"en-US" // 英文(美国)
};
/// <summary>
/// 初始化语言
/// </summary>
public async Task InitializeAsync()
{
// 尝试从本地存储获取保存的语言
Console.WriteLine("尝试从本地存储获取保存的语言 Initializing LanguageProvider...");
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)
{
Console.WriteLine("切换语言 ChangeLanguageAsync to " + languageCode);
if (SupportedLanguages.Contains(languageCode) && CurrentLanguage != languageCode)
{
CurrentLanguage = languageCode;
// 保存到本地存储
try
{
await _jsRuntime.InvokeVoidAsync("localStorage.setItem", "preferred-language", languageCode);
}
catch
{
// 忽略错误
}
// 通知语言已更改
OnLanguageChanged?.Invoke();
}
}
/// <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"; // 默认语言
}
}
}