作者: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 檔案適用於共同作業的線上編輯工具。
範例
以下是範例 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! 文字。
複數化
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 檔案非常適合用於協作的線上編輯工具。
範例
以下是範例 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! 文字。
複數表示
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 範例進行微幅新增。 藉由設定保留 msgctxt
項目的值,可以將位於 Pages/Index.cshtml
的 Razor 檢視定義為檔案情境:
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 檔案適合與共同作業的線上編輯工具配合使用。
範例
以下是範例 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! 文字。
複數化
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.
請注意,在捷克文文化特性中,這三種翻譯都不同。 法國和英國文化對最後兩個被翻譯的字串共用相同的結構方式。
進階工作
內容化字串
應用程式通常包含要在數個位置中翻譯的字串。 相同的字串可能在應用程式內的特定位置(檢視或類別檔案)具有不同的翻譯。 PO 檔案支援檔案內容的概念,可用來對所表示的字串進行分類。 使用檔案內容,字串可以根據檔案內容 (或缺乏檔案內容) 翻譯成不同的內容。
PO 當地語系化服務會使用翻譯字串時所使用的完整類別或檢視的名稱。 這是透過在 msgctxt
項目上設定值來完成的。
考慮對先前的 fr.po 範例進行微幅新增。 藉由設定保留 msgctxt
項目的值,即可將位於 Views/Home/About.cshtml
的 Razor 檢視定義為檔案上下文。
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)
多載,其可接受翻譯的字串陣列。