使用 ASP.NET Core 設定可攜式物件當地語系化
作者: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
,則會使用 fr.po 檔案。
測試應用程式
執行應用程式,即會顯示 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 範例進行微幅新增。 藉由設定保留 msgctxt
輸入的值,即可將位於 Pages/Index.cshtml
的 Razor 頁面定義為檔案內容:
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" />
註冊服務
將所需的服務新增至 Startup.cs
的 ConfigureServices
方法:
public void ConfigureServices(IServiceCollection services)
{
services.AddRazorPages()
.AddViewLocalization(LanguageViewLocationExpanderFormat.Suffix);
services.AddPortableObjectLocalization();
services.Configure<RequestLocalizationOptions>(options => options
.AddSupportedCultures("fr", "cs")
.AddSupportedUICultures("fr", "cs")
);
}
將必要的中介軟體新增至 Startup.cs
的 Configure
方法:
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
,則會使用 fr.po 檔案。
測試應用程式
執行您的應用程式,並巡覽至 /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" />
註冊服務
將所需的服務新增至 Startup.cs
的 ConfigureServices
方法:
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;
});
}
將必要的中介軟體新增至 Startup.cs
的 Configure
方法:
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
,則會使用 fr.po 檔案。
測試應用程式
執行您的應用程式,並巡覽至 /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.
請注意,在捷克文文化特性中,這三種翻譯都不同。 法文和英文的文化特性則會對最後兩個翻譯字串共用相同的建構。
進階工作
內容化字串
應用程式通常包含要在數個位置中翻譯的字串。 相同的字串可能在應用程式內的特定位置 (Razor或類別檔案) 具有不同的翻譯。 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)
多載,其可接受翻譯的字串陣列。