使用 ASP.NET Core 設定可攜式物件當地語系化

作者:Hisham Bin AteyaSé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-FRfr-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.

在捷克文文化特性中,這三種翻譯都不同。 法文和英文的文化特性則會對最後兩個翻譯字串共用相同的建構。

進階工作

內容化字串

應用程式通常包含要在數個位置中翻譯的字串。 相同的字串可能在應用程式內的特定位置 (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 RosScott AddieHisham 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.csConfigureServices 方法:

public void ConfigureServices(IServiceCollection services)
{
    services.AddRazorPages()
        .AddViewLocalization(LanguageViewLocationExpanderFormat.Suffix);

    services.AddPortableObjectLocalization();

    services.Configure<RequestLocalizationOptions>(options => options
        .AddSupportedCultures("fr", "cs")
        .AddSupportedUICultures("fr", "cs")
    );
}

將必要的中介軟體新增至 Startup.csConfigure 方法:

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-FRfr-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 RosScott AddieHisham 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.csConfigureServices 方法:

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.csConfigure 方法:

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-FRfr-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) 多載,其可接受翻譯的字串陣列。