91 lines
2.3 KiB
C#
91 lines
2.3 KiB
C#
using System.Net.Http.Json;
|
|
using Microsoft.JSInterop;
|
|
|
|
namespace TuringMachine.Client.Services;
|
|
|
|
public record LanguageInfo(string Code, string DisplayName, string FlagIcon);
|
|
|
|
public class LocalizationService
|
|
{
|
|
private readonly HttpClient _http;
|
|
private readonly IJSRuntime _js;
|
|
private Dictionary<string, string> _translations = new();
|
|
|
|
public static readonly List<LanguageInfo> AvailableLanguages = new()
|
|
{
|
|
new("en-US", "English", "img/flags/us.svg"),
|
|
new("ko-KR", "한국어", "img/flags/kr.svg")
|
|
};
|
|
|
|
public string CurrentLanguage { get; private set; } = "en-US";
|
|
|
|
public LanguageInfo CurrentLanguageInfo =>
|
|
AvailableLanguages.Find(l => l.Code == CurrentLanguage) ?? AvailableLanguages[0];
|
|
|
|
public event Action? OnLanguageChanged;
|
|
|
|
public string this[string key] =>
|
|
_translations.TryGetValue(key, out var value) ? value : key;
|
|
|
|
public string this[string key, params object[] args]
|
|
{
|
|
get
|
|
{
|
|
var template = this[key];
|
|
try { return string.Format(template, args); }
|
|
catch { return template; }
|
|
}
|
|
}
|
|
|
|
public LocalizationService(HttpClient http, IJSRuntime js)
|
|
{
|
|
_http = http;
|
|
_js = js;
|
|
}
|
|
|
|
public async Task InitializeAsync()
|
|
{
|
|
try
|
|
{
|
|
var saved = await _js.InvokeAsync<string?>("localStorage.getItem", "lang");
|
|
CurrentLanguage = string.IsNullOrEmpty(saved) ? "en-US" : saved;
|
|
}
|
|
catch
|
|
{
|
|
CurrentLanguage = "en-US";
|
|
}
|
|
|
|
await LoadTranslationsAsync(CurrentLanguage);
|
|
}
|
|
|
|
public async Task SetLanguageAsync(string lang)
|
|
{
|
|
if (lang == CurrentLanguage) return;
|
|
|
|
CurrentLanguage = lang;
|
|
await LoadTranslationsAsync(lang);
|
|
|
|
try
|
|
{
|
|
await _js.InvokeVoidAsync("localStorage.setItem", "lang", lang);
|
|
await _js.InvokeVoidAsync("setDocumentTitle", this["app.title"]);
|
|
}
|
|
catch { }
|
|
|
|
OnLanguageChanged?.Invoke();
|
|
}
|
|
|
|
private async Task LoadTranslationsAsync(string lang)
|
|
{
|
|
try
|
|
{
|
|
var dict = await _http.GetFromJsonAsync<Dictionary<string, string>>($"i18n/{lang}.json");
|
|
_translations = dict ?? new();
|
|
}
|
|
catch
|
|
{
|
|
_translations = new();
|
|
}
|
|
}
|
|
}
|