User
add: language switch
8c88a89
Raw
History Blame Contribute Delete
5.31 kB
using System.Globalization;
using Microsoft.JSInterop;
using TaskTrackingSystem.Shared.Localization;
namespace TaskTrackingSystem.WebApp.Localization;
public enum AppLanguage
{
English,
Burmese
}
public sealed class UiTextBundle
{
public required string Workspace { get; init; }
public required string SignIn { get; init; }
public required string SignOut { get; init; }
public required string SignOutTitle { get; init; }
public required string SignOutDescription { get; init; }
public required string Cancel { get; init; }
public required string ConfirmSignOut { get; init; }
public required string AccessDenied { get; init; }
public required string AccessDeniedDescription { get; init; }
public required string BackToDashboard { get; init; }
public required string NoAccessItems { get; init; }
public required string AuditLogs { get; init; }
public required string LanguageEnglish { get; init; }
public required string LanguageBurmese { get; init; }
public required string LanguageTitle { get; init; }
}
public sealed class UiLanguageService
{
private const string StorageKey = "tts-language";
private readonly IJSRuntime _js;
public UiLanguageService(IJSRuntime js)
{
_js = js;
}
public AppLanguage CurrentLanguage { get; private set; } = AppLanguage.English;
public UiTextBundle Texts => new()
{
Workspace = AppLocalization.Text("common.workspace", "Workspace"),
SignIn = AppLocalization.Text("common.signIn", "Sign In"),
SignOut = AppLocalization.Text("common.signOut", "Sign Out"),
SignOutTitle = AppLocalization.Text("common.signOutTitle", "Sign Out?"),
SignOutDescription = AppLocalization.Text("common.signOutDescription", "Are you sure you want to sign out of Taskify?"),
Cancel = AppLocalization.Text("common.cancel", "Cancel"),
ConfirmSignOut = AppLocalization.Text("common.confirmSignOut", "Yes, Sign Out"),
AccessDenied = AppLocalization.Text("common.accessDenied", "Access Denied"),
AccessDeniedDescription = AppLocalization.Text("common.accessDeniedDescription", "You do not have permission to access this page. Please contact your system administrator."),
BackToDashboard = AppLocalization.Text("common.backToDashboard", "Back to Dashboard"),
NoAccessItems = AppLocalization.Text("common.noAccessItems", "No access items are available for this role."),
AuditLogs = AppLocalization.Text("page.auditLogs", "Audit Logs"),
LanguageEnglish = AppLocalization.Text("common.languageEnglish", "English"),
LanguageBurmese = AppLocalization.Text("common.languageBurmese", "Burmese"),
LanguageTitle = AppLocalization.Text("common.currentLanguage", "Switch language")
};
public event Action? Changed;
public async Task InitializeAsync()
{
var code = await _js.InvokeAsync<string?>("languagePreference.init", StorageKey);
SetLanguageFromCode(code);
}
public async Task ToggleAsync()
{
var code = await _js.InvokeAsync<string?>("languagePreference.toggle", StorageKey);
SetLanguageFromCode(code);
}
public async Task SetAsync(AppLanguage language)
{
var code = ToCode(language);
await _js.InvokeVoidAsync("languagePreference.set", StorageKey, code);
SetLanguageFromCode(code);
}
public string GetCode() => ToCode(CurrentLanguage);
public static string ToCode(AppLanguage language) => language == AppLanguage.Burmese ? "my-MM" : "en-US";
public static AppLanguage FromCode(string? code) =>
string.Equals(code, "my", StringComparison.OrdinalIgnoreCase) ||
string.Equals(code, "my-MM", StringComparison.OrdinalIgnoreCase)
? AppLanguage.Burmese
: AppLanguage.English;
public string T(string key, string fallback = "") => AppLocalization.Text(key, fallback);
public string Menu(string menuCode, string fallback = "") => AppLocalization.Menu(menuCode, fallback);
public string PageTitle(string key, string fallback = "") => AppLocalization.PageTitle(key, fallback);
public string PageDescription(string key, string fallback = "") => AppLocalization.PageDescription(key, fallback);
public string StatusLabel(TaskTrackingSystem.Shared.Enums.AppTaskStatus status) => AppLocalization.StatusLabel(status);
public string PriorityLabel(TaskTrackingSystem.Shared.Enums.TaskPriority priority) => AppLocalization.PriorityLabel(priority);
public string EscalationLabel(int level) => AppLocalization.EscalationLabel(level);
private void SetLanguageFromCode(string? code)
{
var next = FromCode(code);
ApplyCulture(next);
if (next == CurrentLanguage)
{
return;
}
CurrentLanguage = next;
Changed?.Invoke();
}
private static void ApplyCulture(AppLanguage language)
{
var culture = language == AppLanguage.Burmese ? CultureInfo.GetCultureInfo("my-MM") : CultureInfo.GetCultureInfo("en-US");
CultureInfo.CurrentCulture = culture;
CultureInfo.CurrentUICulture = culture;
CultureInfo.DefaultThreadCurrentCulture = culture;
CultureInfo.DefaultThreadCurrentUICulture = culture;
}
}