多國語系

想在 C# 程式中建立多國語系,有幾個步驟:
1. 新增一個資源檔(.resx)
2. 雙擊此資源檔,並在上方沒有程式碼的地方,依你的需求選擇 public 或 internal
系統便會幫你產生 Resource.Designer.cs
3. 在此資源檔撰寫你的預設語系所對應的 key value
4. 如要新增其他語系如英文,檔名可以這樣命名 Resource.en-US.resx,其餘步驟同上

Resource 建立 Resource 內建程式碼

目錄結構如下 :

Resource 目錄

以 Blazor WebAssembly 為例:
接下來需要安裝 Microsoft.AspNetCore.Localization 這個套件
並在 Program.cs 中加入 :


    var requestCulture = new RequestCulture("en-us", "en-us");

    CultureInfo.DefaultThreadCurrentCulture = requestCulture.UICulture;       
    CultureInfo.DefaultThreadCurrentUICulture = requestCulture.UICulture;       

除此之外專案設定檔(.csporj)必須加入這一行
<BlazorWebAssemblyLoadAllGlobalizationData>true</<BlazorWebAssemblyLoadAllGlobalizationData>
如不加會發生以下錯誤 :

culture that is not supported with the current project configuration

     <PropertyGroup>
        <TargetFramework>net6.0 </TargetFramework>
        <Nullable>enable </Nullable>
        <ImplicitUsings>enable </ImplicitUsings>
        <BlazorWebAssemblyLoadAllGlobalizationData>true </BlazorWebAssemblyLoadAllGlobalizationData>
     </PropertyGroup>      

更改 new RequestCulture("en-us", "en-us"); 中的語系 ex: zh-cn
之後便可以在 .cs 或 .razor 內使用你在資源檔內所設定的語系
格式: @Resource.{你的 key}

至於你的語系要儲存在 cookie (.AspNetCore.Culture 利用 CookieRequestCultureProvider.DefaultCookieName) 還是 localStorage 都可以。
以下提供儲存在 cookie 的方式 :


    setValue(CookieRequestCultureProvider.DefaultCookieName, CookieRequestCultureProvider.MakeCookieValue(requestCulture), 365);   
    
    public async Task setValue(string key, string value, int? days = null)
    {
        var curExp = days != null ? days > 0 ? DateToUTC(days.Value) : "" : expires;
        var value = $"{key}={value}; expires={curExp}; path=/";
        await JSRuntime.InvokeVoidAsync("eval", $"document.cookie = \"{value}\"");
    }
An unhandled error has occurred. Reload 🗙