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("languagePreference.init", StorageKey); SetLanguageFromCode(code); } public async Task ToggleAsync() { var code = await _js.InvokeAsync("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; } }