共用方式為


排除核心 ASP.NET 本地化問題

作者為 Hisham Bin Ateya

本文提供如何診斷 ASP.NET Core 應用程式在地化問題的指引。

本地化設定問題

在地化中介軟體順序
應用程式可能無法本地化,是因為本地化中介軟體的排序沒有如預期。

為了解決這個問題,請確保本地化中介軟體在 MVC 中介軟體之前已經註冊。 否則,本地化中介軟體就不會被套用。

public void ConfigureServices(IServiceCollection services)
{
    services.AddLocalization(options => options.ResourcesPath = "Resources");

    services.AddMvc();
}

本地化資源路徑未找到

RequestCultureProvider 中支援的文化與已註冊的文化不符

資源檔案命名問題

ASP.NET Core 有預先定義的資源檔案命名規則與指引,這些資訊詳見 ASP.NET Core 中的全球化與在地化

缺少資源

資源未被發現的常見原因包括:

  • 資源名稱在 .NET XML 資源檔.resx()或本地化器請求中會拼錯。
  • 某些語言的資源檔案中缺少該資源,但在其他語言中則存在。
  • 如果你還是遇到困難,請查看本地化日誌訊息(記錄在 Debug 日誌等級)以獲取有關缺少資源的更多細節。

小提示

使用 CookieRequestCultureProvider 時,請確認本地化 cookie 值中的文化沒有使用單引號。 例如, c='en-UK'|uic='en-US' 是無效 cookie 值,而 c=en-UK|uic=en-US 是有效值。

資源與類別函式庫問題

ASP.NET Core 預設提供一種方式,讓類別庫透過 ResourceLocationAttribute 找到其資源檔案。

類別函式庫常見的問題包括:

CustomRequestCultureProvider 效果不如預期

RequestLocalizationOptions 類別有三個預設提供者:

CustomRequestCultureProvider 讓你可以自訂本地化文化的提供方式。 當預設提供者不符合你的要求時,會用這個 CustomRequestCultureProvider 方法。

自訂提供者無法正常運作的常見原因是它不是 RequestCultureProviders 清單中的第一個。 若要解決此問題:

  • 請將自訂提供者插入在清單 RequestCultureProviders 的第 0 個位置:

    options.AddInitialRequestCultureProvider(
        new CustomRequestCultureProvider(async context =>
        {
            // My custom request culture logic
            return new ProviderCultureResult("en");
        }));
    
  • 將自訂提供者插入清單中位置 0 RequestCultureProviders

    options.RequestCultureProviders.Insert(0, 
        new CustomRequestCultureProvider(async context =>
        {
            // My custom request culture logic
            return new ProviderCultureResult("en");
        }));
    

根命名空間問題

當組件的根命名空間與組件名稱不同時,本地化預設無法運作。 為避免此問題,請使用在ASP.NET Core 中的全球化與在地化描述的RootNamespace屬性

警告

根命名空間問題可能發生在專案名稱不是有效的 .NET 識別碼時。 例如,使用 my-project-name.csproj 根命名空間 my_project_name 和組合名稱 my-project-name,導致此錯誤。

資源與構建行動

如果你用資源檔案來做在地化,重要的是它們必須有適當的建置動作。 使用 嵌入式資源;否則,他們 ResourceStringLocalizer 無法找到這些資源。

開發人員工具中使用 [感應器] 窗格的位置覆寫

透過 Google Chrome 或 Microsoft Edge 開發人員工具中的 [感應器] 窗格使用位置覆寫時,會在預先呈現之後重設後援語言。 避免在測試時使用 [感應器] 窗格來設定語言。 使用瀏覽器的語言設定來設定語言。

如需詳細資訊,請參閱 Blazor 當地語系化不適用於 InteractiveServer (dotnet/aspnetcore #53707)

GitHub 問題與實用問題解決技巧