作者為 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 找到其資源檔案。
類別函式庫常見的問題包括:
- 在類別庫中缺少 ResourceLocationAttribute 會導致 ResourceManagerStringLocalizerFactory 無法發現這些資源。
- 資源檔案命名。 欲了解更多資訊,請參閱 資源檔案命名問題 章節。
- 更改類別庫的根命名空間。 欲了解更多資訊,請參閱 根命名空間議題 章節。
CustomRequestCultureProvider 效果不如預期
該 RequestLocalizationOptions 類別有三個預設提供者:
- QueryStringRequestCultureProvider
- CookieRequestCultureProvider
- AcceptLanguageHeaderRequestCultureProvider
這 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"); }));
- 使用 AddInitialRequestCultureProvider 擴充方法將自訂提供者設為初始提供者。
根命名空間問題
當組件的根命名空間與組件名稱不同時,本地化預設無法運作。 為避免此問題,請使用在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)。