作者:Hisham Bin Ateya 和 Sébastien Ros。
本文將逐步說明在具有 Orchard Core 架構的 ASP.NET Core 應用程式中使用可攜式物件 (PO) 檔案的步驟。
注意:Orchard Core 不是 Microsoft 產品。 Microsoft 不提供這項功能的支援。
檢視或下載範例程式碼 \(英文\) (如何下載)
什麼是 PO 檔案?
PO 檔案以文字檔的形式散發,其中包含給定語言的翻譯字串。 使用 PO 檔案而不是使用 .resx 檔案的一些優點包括:
- PO 檔案支援複數表示;.resx 檔案不支援複數表示。
- PO 檔案不會像 .resx 檔案一樣進行編譯。 因此,不需要特殊化工具與建置步驟。
- PO 檔案適用於共同作業的線上編輯工具。
Example
以下是範例 PO 檔案,其中包含法文翻譯的兩個字串,其中之一還有其複數形式:
fr.po
#: Pages/Index.cshtml:13
msgid "Hello world!"
msgstr "Bonjour le monde!"
msgid "There is one item."
msgid_plural "There are {0} items."
msgstr[0] "Il y a un élément."
msgstr[1] "Il y a {0} éléments."
此範例使用下列語法:
-
#::指出所要翻譯之字串內容的註解。 相同的字串可能會根據其使用位置而翻譯為不同內容。 -
msgid:未翻譯的字串。 -
msgstr:已翻譯的字串。
要支援複數形式,可以定義更多項目。
-
msgid_plural:未翻譯的複數字串。 -
msgstr[0]:案例 0 的已翻譯字串。 -
msgstr[N]:案例 N 的已翻譯字串。
您可以在這裡找到 PO 檔案規格。
在 ASP.NET Core 中設定 PO 檔案支援
這個範例是根據從 Visual Studio 2022 專案範本產生的 ASP.NET Core Web 應用程式。
參考此套件
請將 OrchardCore.Localization.Core NuGet 套件新增至參考。
.csproj 檔案現在包含與下列內容類似的一行 (版本號碼可能不同):
<PackageReference Include="OrchardCore.Localization.Core" Version="1.5.0" />
註冊服務
將必要的服務新增至 Program.cs:
builder.Services.AddPortableObjectLocalization();
builder.Services
.Configure<RequestLocalizationOptions>(options => options
.AddSupportedCultures("fr", "cs")
.AddSupportedUICultures("fr", "cs"));
builder.Services
.AddRazorPages()
.AddViewLocalization();
將下列程式碼新增至您選擇的 Razor 頁面。 在此範例中會使用 Index.cshtml。
@page
@using Microsoft.AspNetCore.Mvc.Localization
@inject IViewLocalizer Localizer
@{
ViewData["Title"] = "Home";
}
<div class="text-center">
<h1 class="display-4">Welcome</h1>
<p>Learn about <a href="https://docs.microsoft.com/aspnet/core">building Web apps with ASP.NET Core</a>.</p>
</div>
<p>@Localizer["Hello world!"]</p>
IViewLocalizer 實例被注入,用來翻譯文字「Hello world!」。
建立 PO 檔案
在應用程式根資料夾中建立名為 <culture code>.po 的檔案。 在此範例中,檔案名稱是 fr.po,因為使用法文語言:
msgid "Hello world!"
msgstr "Bonjour le monde!"
這個檔案會同時儲存要翻譯的字串和法文的翻譯字串。 如有必要,翻譯會回歸至其母文化。 在此範例中,如果所要求的文化特性是 或 fr-FR,則會使用 fr-CA 檔案。
測試應用程式
執行應用程式,即會顯示 Hello world! 文字。
瀏覽至 URL /Index?culture=fr-FR。 顯示 Bonjour le monde! 文字。
Pluralization
PO 檔案支援複數表示格式,如果相同的字串必須根據基數翻譯為不同的內容,這個檔案很有用。 由於每一種語言都會定義自訂規則來選取要根據基數使用的字串,因此這項工作變得複雜。
Orchard 當地語系化套件會提供 API,以自動叫用這些不同的複數形式。
建立複數化 PO 檔案
將下列內容新增至先前所述的 fr.po 檔案:
msgid "There is one item."
msgid_plural "There are {0} items."
msgstr[0] "Il y a un élément."
msgstr[1] "Il y a {0} éléments."
如需此範例中每個項目所代表意義的說明,請參閱什麼是 PO 檔案?。
新增使用不同複數表示格式的語言
在上述範例中,已使用英文和法文字串。 英文和法文只有兩種複數表示格式,因此共用相同的格式規則,即基數一對應到第一個複數形式。 任何其他基數都映射到第二種複數形式。
並非所有語言都共用相同的規則。 以下是使用捷克文語言的說明,它有三種複數形式。
按照如下所示建立 cs.po 檔案,並注意到複數形式需要使用三種不同的翻譯。
msgid "Hello world!"
msgstr "Ahoj světe!!"
msgid "There is one item."
msgid_plural "There are {0} items."
msgstr[0] "Existuje jedna položka."
msgstr[1] "Existují {0} položky."
msgstr[2] "Existuje {0} položek."
若要接受捷克文的當地語系化,請將 "cs" 新增至 Configure 方法所支援的文化特性清單中:
builder.Services
.Configure<RequestLocalizationOptions>(options => options
.AddSupportedCultures("fr", "cs")
.AddSupportedUICultures("fr", "cs"));
編輯 Pages/Index.cshtml 檔案以呈現數個基數的當地語系化複數字串:
<p>@Localizer.Plural(1, "There is one item.", "There are {0} items.")</p>
<p>@Localizer.Plural(2, "There is one item.", "There are {0} items.")</p>
<p>@Localizer.Plural(5, "There is one item.", "There are {0} items.")</p>
注意:在現實世界的案例中,變數將用來代表計數。 在這裡,我們會重複使用具有三個不同值的相同程式碼,以公開特殊的情況。
切換文化設定後,您會看到下列內容:
針對 /Index:
There is one item.
There are 2 items.
There are 5 items.
針對 /Index?culture=fr:
Il y a un élément.
Il y a 2 éléments.
Il y a 5 éléments.
針對 /Index?culture=cs:
Existuje jedna položka.
Existují 2 položky.
Existuje 5 položek.
在捷克文文化特性中,這三種翻譯都不同。 法文和英文在最後兩個翻譯字串的建構上採用相同的方式。
進階工作
使用其他引數
索引為零 {0} 的引數一律代表計數值。 叫用 Plural 方法時,可以新增其他引數,而其索引會從一 (1) 開始。
<p>@Localizer.Plural(count, "There is one item with the color {1}.", "There are {0} items. The main color is {1}.", color)</p>
將字串情境化
應用程式通常包含要在數個位置中翻譯的字串。 相同的字串在應用程式內的特定位置 (Razor 檢視或類別檔) 可能會具有不同的翻譯。 PO 檔案支援檔案內容的概念,可用來對所表示的字串進行分類。 使用檔案上下文時,字串可以根據檔案上下文(或缺乏檔案上下文)被翻譯成不同的方式。
PO 當地語系化服務會使用翻譯字串時所使用的完整類別或檢視的名稱。 這是透過在 msgctxt 項目上設定值來完成的。
考慮對先前的 fr.po 範例進行微幅新增。 藉由設定保留 Razor 輸入的值,即可將位於 Pages/Index.cshtml 的 msgctxt 頁面定義為檔案內容:
msgctxt "Views.Home.About"
msgid "Hello world!"
msgstr "Bonjour le monde!"
msgctxt 如此設定後,當巡覽至 /Index?culture=fr-FR 時,就會進行文字翻譯。 而瀏覽至 /Privacy?culture=fr-FR 時,不會進行翻譯。
沒有特定項目與給定的檔案內容相符時,Orchard Core 的後援機制會在沒有內容的情況下尋找適當的 PO 檔案。 假設沒有針對 Pages/Privacy.cshtml 定義的特定檔案內容,瀏覽至 /Privacy?culture=fr-FR 即可載入 PO 檔案,例如:
msgid "Hello world!"
msgstr "Bonjour le monde!"
變更 PO 檔案的位置
PO 檔案的預設位置可以在 Programs.cs 中變更:
services.AddPortableObjectLocalization(options => options.ResourcesPath = "Localization");
在此範例中,從 Localization 資料夾載入 PO 檔案。
實作自訂邏輯,以尋找當地語系化檔案
如果尋找 PO 檔案需要更複雜的邏輯,則可以實作 OrchardCore.Localization.PortableObject.ILocalizationFileLocationProvider 介面並將其註冊為服務。 當 PO 檔案可以儲存在不同位置或檔案必須位在資料夾階層內時,這非常有用。
使用不同的預設複數化語言
此套件包含一個特定於兩個複數形式的 Plural 擴充方法。 如果是需要更多複數形式的語言,請建立擴充方法。 利用擴充方法,您不需要提供預設語言的任何當地語系化檔案;原始字串已經可以直接在程式碼中使用。
您可以使用更通用的 Plural(int count, string[] pluralForms, params object[] arguments) 多載,其可接受翻譯的字串陣列。
作者:Sébastien Ros、Scott Addie 和 Hisham Bin Ateya
本文將逐步說明在具有 Orchard Core 架構的 ASP.NET Core 應用程式中使用可攜式物件 (PO) 檔案的步驟。
注意:Orchard Core 不是 Microsoft 產品。 因此,Microsoft 不提供這項功能的支援。
檢視或下載範例程式碼 \(英文\) (如何下載)
什麼是 PO 檔案?
PO 檔案以文字檔的形式散發,其中包含給定語言的翻譯字串。 使用 PO 檔案而不是使用 .resx 檔案的一些優點包括:
- PO 檔案支援複數表示;.resx 檔案不支援複數表示。
- PO 檔案不會像 .resx 檔案一樣進行編譯。 因此,不需要特殊化工具與建置步驟。
- PO 檔案適用於共同作業的線上編輯工具。
Example
以下是範例 PO 檔案,其中包含兩個字串的法文翻譯,包括其複數形式的字串:
fr.po
#: Pages/Index.cshtml:13
msgid "Hello world!"
msgstr "Bonjour le monde!"
msgid "There is one item."
msgid_plural "There are {0} items."
msgstr[0] "Il y a un élément."
msgstr[1] "Il y a {0} éléments."
此範例使用下列語法:
-
#::指出所要翻譯之字串內容的註解。 相同的字串可能會根據其使用位置而翻譯為不同內容。 -
msgid:未翻譯的字串。 -
msgstr:已翻譯的字串。
在支援複數表示的情況下,可以定義多個項目。
-
msgid_plural:未翻譯的複數字串。 -
msgstr[0]:案例 0 的已翻譯字串。 -
msgstr[N]:案例 N 的已翻譯字串。
您可以在這裡找到 PO 檔案規格。
在 ASP.NET Core 中設定 PO 檔案支援
這個範例是根據從 Visual Studio 2019 專案範本產生的 ASP.NET Core MVC 應用程式。
參考此套件
請將 OrchardCore.Localization.Core NuGet 套件新增至參考。
.csproj 檔案現在包含與下列內容類似的一行 (版本號碼可能不同):
<PackageReference Include="OrchardCore.Localization.Core" Version="1.2.0" />
註冊服務
將所需的服務新增至 ConfigureServices 的 Startup.cs 方法:
public void ConfigureServices(IServiceCollection services)
{
services.AddRazorPages()
.AddViewLocalization(LanguageViewLocationExpanderFormat.Suffix);
services.AddPortableObjectLocalization();
services.Configure<RequestLocalizationOptions>(options => options
.AddSupportedCultures("fr", "cs")
.AddSupportedUICultures("fr", "cs")
);
}
將必要的中介軟體添加至 Configure 的 Startup.cs 方法:
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
else
{
app.UseExceptionHandler("/Home/Error");
}
app.UseRouting();
app.UseStaticFiles();
app.UseRequestLocalization();
app.UseEndpoints(endpoints =>
{
endpoints.MapControllerRoute(name: "default", pattern: "{controller=Home}/{action=Index}/{id?}");
});
}
將下列程式碼新增至您選擇的 Razor 頁面。 在此範例中會使用 Index.cshtml。
@page
@using Microsoft.AspNetCore.Mvc.Localization
@inject IViewLocalizer Localizer
@{
ViewData["Title"] = "Home";
}
<div class="text-center">
<h1 class="display-4">Welcome</h1>
<p>Learn about <a href="https://docs.microsoft.com/aspnet/core">building Web apps with ASP.NET Core</a>.</p>
</div>
<p>@Localizer["Hello world!"]</p>
IViewLocalizer 實例被注入,用來翻譯文字「Hello world!」。
建立 PO 檔案
在應用程式根資料夾中建立名為 <culture code>.po 的檔案。 在此範例中,檔案名稱是 fr.po,因為使用法文語言:
msgid "Hello world!"
msgstr "Bonjour le monde!"
這個檔案會同時儲存要翻譯的字串和法文的翻譯字串。 如有必要,翻譯會回歸至其母文化。 在此範例中,如果所要求的文化特性是 或 fr-FR,則會使用 fr-CA 檔案。
測試應用程式
執行您的應用程式,並巡覽至 /Index URL。 隨即顯示 Hello world! 文字。
瀏覽至 URL /Index?culture=fr-FR。 顯示 Bonjour le monde! 文字。
Pluralization
PO 檔案支援複數表示格式,如果相同的字串必須根據基數翻譯為不同的內容,這個檔案很有用。 由於每一種語言都會定義自訂規則來選取要根據基數使用的字串,因此這項工作變得複雜。
Orchard 當地語系化套件會提供 API,以自動叫用這些不同的複數形式。
建立複數化 PO 檔案
將下列內容新增至先前所述的 fr.po 檔案:
msgid "There is one item."
msgid_plural "There are {0} items."
msgstr[0] "Il y a un élément."
msgstr[1] "Il y a {0} éléments."
如需此範例中每個項目所代表意義的說明,請參閱什麼是 PO 檔案?。
新增使用不同複數表示格式的語言
在上述範例中,已使用英文和法文字串。 英文和法文只有兩種複數表示格式,因此共用相同的格式規則,即基數一對應到第一個複數形式。 任何其他基數都映射到第二種複數形式。
並非所有語言都共用相同的規則。 以下是使用捷克文語言的說明,它有三種複數形式。
按照如下所示建立 cs.po 檔案,並注意到複數形式需要使用三種不同的翻譯。
msgid "Hello world!"
msgstr "Ahoj světe!!"
msgid "There is one item."
msgid_plural "There are {0} items."
msgstr[0] "Existuje jedna položka."
msgstr[1] "Existují {0} položky."
msgstr[2] "Existuje {0} položek."
若要接受捷克文的當地語系化,請將 "cs" 新增至 ConfigureServices 方法所支援的文化特性清單中:
services.Configure<RequestLocalizationOptions>(options => options
.AddSupportedCultures("fr", "cs")
.AddSupportedUICultures("fr", "cs")
);
編輯 Pages/Index.cshtml 檔案以呈現數個基數的當地語系化複數字串:
<p>@Localizer.Plural(1, "There is one item.", "There are {0} items.")</p>
<p>@Localizer.Plural(2, "There is one item.", "There are {0} items.")</p>
<p>@Localizer.Plural(5, "There is one item.", "There are {0} items.")</p>
注意:在現實世界的案例中,變數將用來代表計數。 在這裡,我們會重複使用具有三個不同值的相同程式碼,以公開非常特殊的情況。
切換文化設定後,您會看到下列內容:
針對 /Index:
There is one item.
There are 2 items.
There are 5 items.
針對 /Index?culture=fr:
Il y a un élément.
Il y a 2 éléments.
Il y a 5 éléments.
針對 /Index?culture=cs:
Existuje jedna položka.
Existují 2 položky.
Existuje 5 položek.
請注意,在捷克文文化特性中,這三種翻譯都不同。 法文和英文在最後兩個翻譯字串的建構上採用相同的方式。
進階工作
將字串情境化
應用程式通常包含要在數個位置中翻譯的字串。 相同的字串在應用程式內的特定位置 (Razor 檢視或類別檔) 可能會具有不同的翻譯。 PO 檔案支援檔案內容的概念,可用來對所表示的字串進行分類。 使用檔案上下文時,字串可以根據檔案上下文(或缺乏檔案上下文)被翻譯成不同的方式。
PO 當地語系化服務會使用翻譯字串時所使用的完整類別或檢視的名稱。 這是透過在 msgctxt 項目上設定值來完成的。
考慮對先前的 fr.po 範例進行微幅新增。 藉由設定保留 Razor 項目的值,可以將位於 Pages/Index.cshtml 的 msgctxt 檢視定義為檔案情境:
msgctxt "Pages.Index"
msgid "Hello world!"
msgstr "Bonjour le monde!"
msgctxt 如此設定後,當巡覽至 /Index?culture=fr-FR 時,就會進行文字翻譯。 而巡覽至 /Privacy?culture=fr-FR 時,不會進行翻譯。
沒有特定項目與給定的檔案內容相符時,Orchard Core 的後援機制會在沒有內容的情況下尋找適當的 PO 檔案。 假設沒有針對 Pages/Privacy.cshtml 定義的特定檔案內容,瀏覽至 /Privacy?culture=fr-FR 即可載入 PO 檔案,例如:
msgid "Hello world!"
msgstr "Bonjour le monde!"
變更 PO 檔案的位置
PO 檔案的預設位置可以在 ConfigureServices 中變更:
services.AddPortableObjectLocalization(options => options.ResourcesPath = "Localization");
在此範例中,從 Localization 資料夾載入 PO 檔案。
實作自訂邏輯,以尋找當地語系化檔案
如果尋找 PO 檔案需要更複雜的邏輯,則可以實作 OrchardCore.Localization.PortableObject.ILocalizationFileLocationProvider 介面並將其註冊為服務。 當 PO 檔案可以儲存在不同位置或檔案必須位在資料夾階層內時,這非常有用。
使用不同的預設複數化語言
此套件包含一個特定於兩個複數形式的 Plural 擴充方法。 如果是需要更多複數形式的語言,請建立擴充方法。 利用擴充方法,您不需要提供預設語言的任何當地語系化檔案;原始字串已經可以直接在程式碼中使用。
您可以使用更通用的 Plural(int count, string[] pluralForms, params object[] arguments) 多載,其可接受翻譯的字串陣列。
作者:Sébastien Ros、Scott Addie 和 Hisham Bin Ateya
本文將逐步說明在具有 Orchard Core 架構的 ASP.NET Core 應用程式中使用可攜式物件 (PO) 檔案的步驟。
注意:Orchard Core 不是 Microsoft 產品。 因此,Microsoft 不提供這項功能的支援。
檢視或下載範例程式碼 \(英文\) (如何下載)
什麼是 PO 檔案?
PO 檔案以文字檔的形式散發,其中包含給定語言的翻譯字串。 使用 PO 檔案而不是使用 .resx 檔案的一些優點包括:
- PO 檔案支援複數表示;.resx 檔案不支援複數表示。
- PO 檔案不會像 .resx 檔案一樣進行編譯。 因此,不需要特殊化工具與建置步驟。
- PO 檔案適用於共同作業的線上編輯工具。
Example
以下是範例 PO 檔案,其中包含兩個字串的法文翻譯,包括其複數形式的字串:
fr.po
#: Services/EmailService.cs:29
msgid "Enter a comma separated list of email addresses."
msgstr "Entrez une liste d'emails séparés par une virgule."
#: Views/Email.cshtml:112
msgid "The email address is \"{0}\"."
msgid_plural "The email addresses are \"{0}\"."
msgstr[0] "L'adresse email est \"{0}\"."
msgstr[1] "Les adresses email sont \"{0}\""
此範例使用下列語法:
-
#::指出所要翻譯之字串內容的註解。 相同的字串可能會根據其使用位置而翻譯為不同內容。 -
msgid:未翻譯的字串。 -
msgstr:已翻譯的字串。
在支援複數表示的情況下,可以定義多個項目。
-
msgid_plural:未翻譯的複數字串。 -
msgstr[0]:案例 0 的已翻譯字串。 -
msgstr[N]:案例 N 的已翻譯字串。
您可以在這裡找到 PO 檔案規格。
在 ASP.NET Core 中設定 PO 檔案支援
這個範例是根據從 Visual Studio 2017 專案範本產生的 ASP.NET Core MVC 應用程式。
參考此套件
請將 OrchardCore.Localization.Core NuGet 套件新增至參考。
.csproj 檔案現在包含與下列內容類似的一行 (版本號碼可能不同):
<PackageReference Include="OrchardCore.Localization.Core" Version="1.0.0" />
註冊服務
將所需的服務新增至 ConfigureServices 的 Startup.cs 方法:
public void ConfigureServices(IServiceCollection services)
{
services.AddMvc()
.AddViewLocalization(LanguageViewLocationExpanderFormat.Suffix);
services.AddPortableObjectLocalization();
services.Configure<RequestLocalizationOptions>(options =>
{
var supportedCultures = new List<CultureInfo>
{
new CultureInfo("en-US"),
new CultureInfo("en"),
new CultureInfo("fr-FR"),
new CultureInfo("fr")
};
options.DefaultRequestCulture = new RequestCulture("en-US");
options.SupportedCultures = supportedCultures;
options.SupportedUICultures = supportedCultures;
});
}
將必要的中介軟體添加至 Configure 的 Startup.cs 方法:
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
else
{
app.UseExceptionHandler("/Home/Error");
}
app.UseRouting();
app.UseStaticFiles();
app.UseRequestLocalization();
app.UseEndpoints(endpoints =>
{
endpoints.MapControllerRoute(name: "default", pattern: "{controller=Home}/{action=Index}/{id?}");
});
}
將下列程式碼新增至所選擇的 Razor 檢視。 在此範例中會使用 About.cshtml。
@using Microsoft.AspNetCore.Mvc.Localization
@inject IViewLocalizer Localizer
<p>@Localizer["Hello world!"]</p>
IViewLocalizer 實例被注入,用來翻譯文字「Hello world!」。
建立 PO 檔案
在應用程式根資料夾中建立名為 <culture code>.po 的檔案。 在此範例中,檔案名稱是 fr.po,因為使用法文語言:
msgid "Hello world!"
msgstr "Bonjour le monde!"
這個檔案會同時儲存要翻譯的字串和法文的翻譯字串。 如有必要,翻譯會回歸至其母文化。 在此範例中,如果所要求的文化特性是 或 fr-FR,則會使用 fr-CA 檔案。
測試應用程式
執行您的應用程式,並巡覽至 /Home/About URL。 隨即顯示 Hello world! 文字。
瀏覽至 URL /Home/About?culture=fr-FR。 顯示 Bonjour le monde! 文字。
Pluralization
PO 檔案支援複數表示格式,如果相同的字串必須根據基數翻譯為不同的內容,這個檔案很有用。 由於每一種語言都會定義自訂規則來選取要根據基數使用的字串,因此這項工作變得複雜。
Orchard 當地語系化套件會提供 API,以自動叫用這些不同的複數形式。
建立複數化 PO 檔案
將下列內容新增至先前所述的 fr.po 檔案:
msgid "There is one item."
msgid_plural "There are {0} items."
msgstr[0] "Il y a un élément."
msgstr[1] "Il y a {0} éléments."
如需此範例中每個項目所代表意義的說明,請參閱什麼是 PO 檔案?。
新增使用不同複數表示格式的語言
在上述範例中,已使用英文和法文字串。 英文和法文只有兩種複數表示格式,因此共用相同的格式規則,即基數一對應到第一個複數形式。 任何其他基數都映射到第二種複數形式。
並非所有語言都共用相同的規則。 以下是使用捷克文語言的說明,它有三種複數形式。
按照如下所示建立 cs.po 檔案,並注意到複數形式需要使用三種不同的翻譯。
msgid "Hello world!"
msgstr "Ahoj světe!!"
msgid "There is one item."
msgid_plural "There are {0} items."
msgstr[0] "Existuje jedna položka."
msgstr[1] "Existují {0} položky."
msgstr[2] "Existuje {0} položek."
若要接受捷克文的當地語系化,請將 "cs" 新增至 ConfigureServices 方法所支援的文化特性清單中:
var supportedCultures = new List<CultureInfo>
{
new CultureInfo("en-US"),
new CultureInfo("en"),
new CultureInfo("fr-FR"),
new CultureInfo("fr"),
new CultureInfo("cs")
};
編輯 Views/Home/About.cshtml 檔案以呈現數個基數的當地語系化複數字串:
<p>@Localizer.Plural(1, "There is one item.", "There are {0} items.")</p>
<p>@Localizer.Plural(2, "There is one item.", "There are {0} items.")</p>
<p>@Localizer.Plural(5, "There is one item.", "There are {0} items.")</p>
注意:在現實世界的案例中,變數將用來代表計數。 在這裡,我們會重複使用具有三個不同值的相同程式碼,以公開非常特殊的情況。
切換文化設定後,您會看到下列內容:
針對 /Home/About:
There is one item.
There are 2 items.
There are 5 items.
針對 /Home/About?culture=fr:
Il y a un élément.
Il y a 2 éléments.
Il y a 5 éléments.
針對 /Home/About?culture=cs:
Existuje jedna položka.
Existují 2 položky.
Existuje 5 položek.
請注意,在捷克文文化特性中,這三種翻譯都不同。 法文和英文在最後兩個翻譯字串的建構上採用相同的方式。
進階工作
將字串情境化
應用程式通常包含要在數個位置中翻譯的字串。 相同的字串在應用程式內的特定位置 (Razor 檢視或類別檔) 可能會具有不同的翻譯。 PO 檔案支援檔案內容的概念,可用來對所表示的字串進行分類。 使用檔案上下文時,字串可以根據檔案上下文(或缺乏檔案上下文)被翻譯成不同的方式。
PO 當地語系化服務會使用翻譯字串時所使用的完整類別或檢視的名稱。 這是透過在 msgctxt 項目上設定值來完成的。
考慮對先前的 fr.po 範例進行微幅新增。 藉由設定保留 Razor 項目的值,可以將位於 Views/Home/About.cshtml 的 msgctxt 檢視定義為檔案情境:
msgctxt "Views.Home.About"
msgid "Hello world!"
msgstr "Bonjour le monde!"
msgctxt 如此設定後,當巡覽至 /Home/About?culture=fr-FR 時,就會進行文字翻譯。 而巡覽至 /Home/Contact?culture=fr-FR 時,不會進行翻譯。
沒有特定項目與給定的檔案內容相符時,Orchard Core 的後援機制會在沒有內容的情況下尋找適當的 PO 檔案。 假設沒有針對 Views/Home/Contact.cshtml 定義的特定檔案內容,瀏覽至 /Home/Contact?culture=fr-FR 即可載入 PO 檔案,例如:
msgid "Hello world!"
msgstr "Bonjour le monde!"
變更 PO 檔案的位置
PO 檔案的預設位置可以在 ConfigureServices 中變更:
services.AddPortableObjectLocalization(options => options.ResourcesPath = "Localization");
在此範例中,從 Localization 資料夾載入 PO 檔案。
實作自訂邏輯,以尋找當地語系化檔案
如果尋找 PO 檔案需要更複雜的邏輯,則可以實作 OrchardCore.Localization.PortableObject.ILocalizationFileLocationProvider 介面並將其註冊為服務。 當 PO 檔案可以儲存在不同位置或檔案必須位在資料夾階層內時,這非常有用。
使用不同的預設複數化語言
此套件包含一個特定於兩個複數形式的 Plural 擴充方法。 如果是需要更多複數形式的語言,請建立擴充方法。 利用擴充方法,您不需要提供預設語言的任何當地語系化檔案;原始字串已經可以直接在程式碼中使用。
您可以使用更通用的 Plural(int count, string[] pluralForms, params object[] arguments) 多載,其可接受翻譯的字串陣列。