File size: 5,314 Bytes
8c88a89
8f72634
8c88a89
8f72634
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
8c88a89
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
8f72634
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
8c88a89
8f72634
 
8c88a89
 
 
 
 
 
 
 
 
 
 
 
8f72634
 
 
 
8c88a89
 
8f72634
 
 
 
 
 
 
 
 
8c88a89
8f72634
8c88a89
 
 
 
 
 
8f72634
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
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;
    }
}