當地語系化

Browse sample. 流覽範例

當地語系化是調整應用程式以符合目標市場特定語言或文化需求的程式。 若要當地語系化應用程式,其文字和影像可能需要翻譯成多種語言。 本地化的應用程式會根據裝置的文化特性設定自動顯示翻譯的文字。

.NET 包含使用資源檔案將應用程式本地化的機制。 資源檔會將文字和其他內容儲存為名稱/值組,讓應用程式擷取所提供密鑰的內容。 資源檔案允許當地語系化的內容與應用程式程式代碼分開。 除了儲存文字之外,資源檔也可以儲存影像和二進位數據。 不過,裝置有一系列螢幕大小和密度,而且每個平臺都有顯示密度相依影像的功能。 因此,平臺功能應該用於當地語系化影像,而不是將它們儲存在資源檔中。

若要將 .NET 多平臺應用程式 UI (.NET MAUI) 應用程式本地化,您應該:

  1. 建立資源文件來儲存字串。 如需詳細資訊,請參閱 建立資源文件來儲存字串
  2. 指定應用程式的中性語言。 如需詳細資訊,請參閱 指定應用程式的中性語言
  3. 執行平台設定。 如需詳細資訊,請參閱 執行平台設定
  4. 當地語系化文字。 如需詳細資訊,請參閱 本地化文字
  5. 將影像當地語系化。 如需詳細資訊,請參閱 本地化映像
  6. 將應用程式名稱當地語系化。 如需詳細資訊,請參閱 本地化應用程式名稱
  7. 測試當地語系化。 如需詳細資訊,請參閱 測試當地語系化

此外,也可以指定應用程式的版面配置方向。 如需詳細資訊,請參閱 從右至左本地化

建立資源檔以儲存字串

.NET 資源檔是擴展名為 .resx 的 XML 檔案,會在建置程式期間編譯成二進位資源 (.resources) 檔案。 本地化的應用程式通常會包含預設資源檔,其中包含應用程式中使用的所有字串,以及每個支援語言的資源檔。

資源檔案包含每個專案的下列資訊:

  • 名稱 會指定用來存取程式代碼中文字的索引鍵。
  • 會指定翻譯的文字。
  • 批註 是包含其他信息的選擇性欄位。

您可以在 Visual Studio 中使用 [新增專案 ] 對話框來新增資源檔:

Screenshot of adding a resource file in Visual Studio.

一旦新增檔案,就可以為每個文字資源新增數據列:

Screenshot of the default strings for the app.

Access 修飾詞 下拉式清單決定Visual Studio如何產生用來存取資源的類別。 將 Access 修飾詞設定為 PublicInternal ,會產生具有指定輔助功能層級的產生類別。 將 Access 修飾詞設定為 [無程式代碼產生 ] 不會產生類別檔案。 默認資源文件應該設定為產生類別檔案,這會導致具有 的 檔案。要新增至專案的 Designer.cs 延伸模組。

建立預設資源檔之後,可以針對應用程式支援的每個地區設定建立其他檔案。 每個額外的資源檔都應該有與預設資源檔相同的根檔名,但也應該在檔名中包含語言和選擇性文化特性。 例如,如果您新增名為 AppResources.resx 的資源檔,您可能也會建立名為 AppResources.en-US.resx 和 AppResources.fr-FR.resx 的資源文件,分別保留英文(美國)和法文(法國)文化特性的當地語系化資源。 此外,您應該將每個額外資源檔的 Access 修飾詞設定[無程式代碼產生]。

在運行時間,您的應用程式會嘗試依特定順序解析資源要求。 例如,如果裝置文化特性為 en-US ,應用程式會依下列順序尋找資源檔:

  1. AppResources.en-US.resx
  2. AppResources.en.resx
  3. AppResources.resx (預設值)

下列螢幕快照顯示名為 AppResources.es.resx 的西班牙文翻譯檔案:

Screenshot of the Spanish strings for the app.

本地化的資源檔會使用預設檔案中指定的相同 Name 值,但在 Value 資料行中包含西班牙文語言字串。 此外, Access 修飾詞 會設定為 [無程式代碼產生]。

指定應用程式的中性語言

若要讓 .NET 資源檔案正常運作,應用程式必須指定中性語言。 如果找不到地區設定的資源,則會使用其資源的語言。 若要指定中性語言:

  1. 在 [方案總管] 中,以滑鼠右鍵按兩下 .NET MAUI 應用程式項目,然後選取 [屬性]。

  2. 選取 [ 套件 > 一般 ] 屬性頁,然後從 [元件中性語言] 下拉式清單中選取適當的語言 和文化特性:

    Screenshot of setting the neutral language for the assembly.

  3. 儲存您的變更。

或者,將 <NeutralLanguage> 元素新增至項目檔中的第一個 <PropertyGroup> ,並指定您選擇的地區設定作為其值:

<NeutralLanguage>en-US</NeutralLanguage>

警告

如果您未指定中性語言,類別 ResourceManagernull 傳回任何語言的值,而不需要資源檔。 指定中性語言時,類別 ResourceManager 會針對不支援的語言傳回中性語言資源文件的結果。 因此,建議您一律指定中性語言,以便針對不支援的語言顯示文字。

執行平台設定

iOS、Mac Catalyst 和 Windows 上需要其他設定,以便當地語系化所有 .NET MAUI 控制件。

iOS 和 Mac Catalyst

在 iOS 和 Mac Catalyst 上,您必須在 .NET MAUI 應用程式項目中平臺 Info.plist 檔案中宣告所有支持的語言。 若要這樣做,請在 XML 編輯器中開啟 所選平臺的 Info.plist 檔案,並建立索引鍵的 CFBundleLocalizations 陣列。 然後提供對應至資源文件的陣列值。 此外,請確定您透過 CFBundleDevelopmentRegion 索引鍵設定預期的語言:

<key>CFBundleLocalizations</key>
<array>
    <string>de</string>
    <string>es</string>
    <string>fr</string>
    <string>ja</string>
    <string>pt</string> <!-- Brazil -->
    <string>pt-PT</string> <!-- Portugal -->
    <string>ru</string>
    <string>zh-Hans</string>
    <string>zh-Hant</string>
</array>
<key>CFBundleDevelopmentRegion</key>
<string>en</string>

或者,在 Visual Studio 的 方案總管 中,在 [一般 PList 編輯器] 中開啟所選平臺的 Info.plist 檔案。 然後,建立索引鍵的 CFBundleLocalizations 陣列,並提供對應至資源文件的陣列值。 此外,請確定您透過 CFBundleDevelopmentRegion 索引鍵設定預期的語言:

Screenshot of the supported locales for the app in the generic Info.plist editor.

如需 Info.plist 檔案的詳細資訊,請參閱 Information 屬性清單

Windows

若要在 Windows 上的 .NET MAUI 應用程式中支援多種語言,您必須在 .NET MAUI 應用程式專案的 Platform\Windows\Package.appxmanifest 檔案中宣告每個支持的語言:

  1. 文本編輯器中開啟 Package.appxmanifest 檔案,並找出下列區段:

    <Resources>
        <Resource Language="x-generate"/>
    </Resources>
    
  2. <Resource Language="x-generate">取代為<Resource />每個支援語言的專案:

    <Resources>
        <Resource Language="en-US"/>
        <Resource Language="de-DE"/>
        <Resource Language="es-ES"/>
        <Resource Language="fr-FR"/>
        <Resource Language="ja-JP"/>
        <Resource Language="pt-BR"/>
        <Resource Language="pt-PT"/>
        <Resource Language="ru-RU"/>
        <Resource Language="zh-CN"/>
        <Resource Language="zh-TW"/>
    </Resources>
    
  3. 儲存您的變更。

當地語系化文字

文字會使用從預設資源檔案產生的類別進行當地語系化。 類別會根據預設資源檔名來命名。 根據 AppResources.resx 的預設資源檔名,Visual Studio 會產生名為 的相符類別,其中包含AppResources資源檔中每個專案的靜態屬性。

在 XAML 中,可以使用標記延伸來擷取 x:Static 本地化的文字,以存取產生的靜態屬性:

<ContentPage ...
             xmlns:strings="clr-namespace:LocalizationDemo.Resources.Strings">
    <VerticalStackLayout>
        <Label Text="{x:Static strings:AppResources.NotesLabel}" />
        <Entry Placeholder="{x:Static strings:AppResources.NotesPlaceholder}" />
        <Button Text="{x:Static strings:AppResources.AddButton}" />
    </VerticalStackLayout>
</ContentPage>

如需標記延伸的詳細資訊 x:Static ,請參閱 x:Static 標記延伸

您也可以在程式代碼中擷取本地化的文字:

Label notesLabel = new Label();
notesLabel.Text = AppResources.NotesLabel,

Entry notesEntry = new Entry();
notesEntry.Placeholder = AppResources.NotesPlaceholder,

Button addButton = new Button();
addButton.Text = AppResources.AddButton,

類別中的 AppResources 屬性會使用 CurrentUICulture 屬性值來判斷要從中擷取值的資源檔。

將影像當地語系化

除了儲存文字之外,資源檔也可以儲存影像和二進位數據。 不過,裝置有一系列螢幕大小和密度,而且每個平臺都有顯示密度相依影像的功能。 因此,平臺功能應該用於當地語系化影像,而不是將它們儲存在資源檔中。

Android

在 Android 上,稱為可繪製的當地語系化影像會使用平臺\Android\Resources 資料夾中的資料夾型命名慣例來儲存。 資料夾應該以語言和文化特性的後綴命名 為可 繪製。 例如,西班牙文資料夾的名稱為 drawable-es。 可繪製的資料夾名稱應該包含預設語言和文化特性的影像。 每個映像的建置動作都應該設定為 AndroidResource

注意

相較於將個別檔案設定為 AndroidResource 建置動作,您可以將下列 XML 新增至您應用程式的專案 (.csproj) 檔案,將特定資料夾的內容設定為此建置動作:

<ItemGroup Condition="$(TargetFramework.Contains('-android'))">
  <AndroidResource Include="Platforms\Android\Resources\**" TargetPath="%(RecursiveDir)%(Filename)%(Extension)" />
</ItemGroup>

本範例會將 [平臺\Android\Resources ] 資料夾中的任何內容,包括子資料夾中的內容設定為 AndroidResource 建置動作。 它也會使用此建置動作來設定每個檔案的輸出路徑。

指定最上層語言時,文件夾名稱中只需要兩個字元,例如 es。 不過,指定完整地區設定時,文件夾名稱格式需要虛線和小寫 r 來分隔語言與文化特性。 例如,墨西哥地區設定 (es-MX) 資料夾應該命名為 drawable-es-rMX。 每個地區設定資料夾中的映像檔名稱應該相同:

Screenshot of the localized folder structure in Visual Studio for images on Android.

iOS

在iOS上,當地語系化映像會使用平臺\iOS\Resources 資料夾中的資料夾型命名慣例來儲存。 資料夾應該以語言和選擇性文化特性命名,後面接著 .lproj。 例如,西班牙文資料夾的名稱為 es.lproj。 每個映像的建置動作都應該設定為 BundleResource

注意

相較於將個別檔案設定為 BundleResource 建置動作,您可以將下列 XML 新增至您應用程式的專案 (.csproj) 檔案,將特定資料夾的內容設定為此建置動作:

<ItemGroup Condition="$(TargetFramework.Contains('-ios'))">
  <BundleResource Include="Platforms\iOS\Resources\**" TargetPath="%(RecursiveDir)%(Filename)%(Extension)" />
</ItemGroup>

本範例會將 Platform\iOS\Resources 資料夾中的任何內容,包括子資料夾中的內容設定為 BundleResource 建置動作。 它也會使用此建置動作來設定每個檔案的輸出路徑。

指定最上層語言時,文件夾名稱中只需要兩個字元,例如 es。 不過,指定完整地區設定時,文件夾名稱格式需要虛線來分隔語言與文化特性。 例如,墨西哥地區設定 (es-MX) 資料夾應該命名為 es-MX.lproj。 每個地區設定資料夾中的映像檔名稱應該相同:

Screenshot of the localized folder structure in Visual Studio for images on iOS.

此外,在您的項目檔中,您必須將 IPhoneResourcePrefix build 屬性設定為包含當地語系化影像資料夾的資料夾:

<PropertyGroup Condition="$(TargetFramework.Contains('-ios'))">
  <IPhoneResourcePrefix>Platforms/iOS/Resources</IPhoneResourcePrefix>
</PropertyGroup>

如果特定語言沒有影像,iOS 會回復為預設原生語言資料夾,並從該處載入映像。

Mac Catalyst

在 Mac Catalyst 上,當地語系化的影像會使用平臺\MacCatalyst\Resources 資料夾中的資料夾型命名慣例來儲存。 資料夾應該以語言和選擇性文化特性命名,後面接著 .lproj。 例如,西班牙文資料夾的名稱為 es.lproj。 每個映像的建置動作都應該設定為 BundleResource

注意

相較於將個別檔案設定為 BundleResource 建置動作,您可以將下列 XML 新增至您應用程式的專案 (.csproj) 檔案,將特定資料夾的內容設定為此建置動作:

<ItemGroup Condition="$(TargetFramework.Contains('-maccatalyst'))">
  <BundleResource Include="Platforms\MacCatalyst\Resources\**" TargetPath="%(RecursiveDir)%(Filename)%(Extension)" />
</ItemGroup>

本範例會將 Platforms\MacCatalyst\Resources 資料夾中的任何內容,包括子資料夾中的內容設定為 BundleResource 建置動作。 它也會使用此建置動作來設定每個檔案的輸出路徑。

指定最上層語言時,文件夾名稱中只需要兩個字元,例如 es。 不過,指定完整地區設定時,文件夾名稱格式需要虛線來分隔語言與文化特性。 例如,墨西哥地區設定 (es-MX) 資料夾應該命名為 es-MX.lproj。 每個地區設定資料夾中的映像檔名稱應該相同:

Screenshot of the localized folder structure in Visual Studio for images on MacCatalyst.

此外,在您的項目檔中,您必須將 IPhoneResourcePrefix build 屬性設定為包含當地語系化影像資料夾的資料夾:

<PropertyGroup Condition="$(TargetFramework.Contains('-maccatalyst'))">
  <IPhoneResourcePrefix>Platforms/MacCatalyst/Resources</IPhoneResourcePrefix>
</PropertyGroup>

如果特定語言沒有影像,Mac Catalyst 會回復為預設原生語言資料夾,然後從該處載入影像。

Windows

在 Windows 上,當地語系化映像會使用平臺\Windows\Assets\Images 資料夾中的資料夾型命名慣例來儲存。 資料夾應該以語言和選擇性文化特性命名。 例如,西班牙文資料夾的名稱為 es ,而墨西哥地區設定資料夾應命名為 es-MX。 每個映像的建置動作都應該設定為 [內容]。

注意

相較於將個別檔案設定為 內容 建置動作,您可以將下列 XML 新增至您應用程式的專案 (.csproj) 檔案,將特定資料夾的內容設定為此建置動作:

<ItemGroup Condition="$(TargetFramework.Contains('-windows'))">
  <Content Include="Platforms\Windows\Assets\Images\**" TargetPath="%(RecursiveDir)%(Filename)%(Extension)" />
</ItemGroup>

本範例會將 [平臺\Windows\Assets\Images ] 資料夾中的任何內容,包括子資料夾中的內容設定為 [內容 建置] 動作。 它也會使用此建置動作來設定每個檔案的輸出路徑。

指定最上層語言時,文件夾名稱中只需要兩個字元,例如 es。 不過,指定完整地區設定時,文件夾名稱格式需要虛線來分隔語言與文化特性。 例如,墨西哥地區設定 (es-MX) 資料夾應該命名為 es-MX。 每個地區設定資料夾中的映像檔名稱應該相同:

Screenshot of the localized folder structure in Visual Studio for images on Windows.

取用本地化的影像

在 Android、iOS、Mac Catalyst 和 Windows 上,您可以將 的 Image 屬性設定Source為影像檔名,以取用本地化的影像:

<Image Source="flag.png" />

不過,若要在 Windows 上運作,如果您已為每個當地語系化映像新增 <Content /> MSBuild 專案,就必須修改應用程式的項目檔。 這可以藉由修改 .csproj 檔案來移除每個映像的 <Content /> MSBuild 專案來完成。 然後,新增下列 MSBuild 專案:

<ItemGroup Condition="$(TargetFramework.Contains('-windows'))">
  <Content Include="Platforms\Windows\Assets\Images\**" TargetPath="%(RecursiveDir)%(Filename)%(Extension)" />
</ItemGroup>

這可確保平臺\Windows\Assets\Images 資料夾子資料夾中的所有映射都會複製到應用程式套件的根目錄。

將應用程式名稱當地語系化

當地語系化應用程式名稱需要平臺功能。

Android

在 Android 上,本地化的應用程式名稱可以使用平臺\Android\Resources 資料夾中的資料夾型命名慣例來儲存。 資料夾應以語言和文化特性的後綴命名 。 例如,西班牙文資料夾的名稱是 values-es將具有 AndroidResource 建置動作的 Strings.xml 檔案新增至將字串設定為當地語系化應用程式名稱的每個資料夾。

注意

相較於將個別檔案設定為 AndroidResource 建置動作,您可以將下列 XML 新增至您應用程式的專案 (.csproj) 檔案,將特定資料夾的內容設定為此建置動作:

<ItemGroup Condition="$(TargetFramework.Contains('-android'))">
  <AndroidResource Include="Platforms\Android\Resources\**" TargetPath="%(RecursiveDir)%(Filename)%(Extension)" />
</ItemGroup>

本範例會將 [平臺\Android\Resources ] 資料夾中的任何內容,包括子資料夾中的內容設定為 AndroidResource 建置動作。 它也會使用此建置動作來設定每個檔案的輸出路徑。

指定最上層語言時,文件夾名稱中只需要兩個字元,例如 es。 不過,指定完整地區設定時,文件夾名稱格式需要虛線和小寫 r 來分隔語言與文化特性。 例如,墨西哥地區設定 (es-MX) 資料夾應該命名為 values-es-rMX

每個可翻譯的字串都是一個 XML 元素,其資源識別元指定為 name 屬性,而翻譯的字串則為 值。 您必須根據一般 XML 規則逸出字串,而且 name 必須是有效的 Android 資源識別碼(沒有空格或破折號)。

因此,若要將應用程式名稱當地語系化,請 建立 Strings.xml 檔案,並將專案新增 <string> 為專案的子 <resources> 系。 然後,將其 name 屬性設定為適當的標識碼,並將翻譯的字串設定為值:

<resources>
    <!-- French -->
    <string name="app_name">Maison</string>
</resources>

然後,若要在應用程式中使用本地化的應用程式名稱,請將 Label 屬性新增至 Activity 您應用程式類別中的 MainActivity ,並將其值設定為 @string/id

[Activity(Label = "@string/app_name", Theme = "@style/Maui.SplashTheme", MainLauncher = true, ConfigurationChanges = ConfigChanges.ScreenSize | ConfigChanges.Orientation | ConfigChanges.UiMode | ConfigChanges.ScreenLayout | ConfigChanges.SmallestScreenSize | ConfigChanges.Density)]
public class MainActivity : MauiAppCompatActivity
{
    protected override void OnCreate(Bundle savedInstanceState)
    {
        base.OnCreate(savedInstanceState);
    }
}

iOS

在iOS上,本地化的應用程式名稱會使用平臺\iOS\Resources 資料夾中的資料夾型命名慣例來儲存。 資料夾應該以語言和選擇性文化特性命名,後面接著 .lproj。 例如,西班牙文資料夾的名稱為 es.lproj將具有 BundleResource 建置動作的 InfoPlist.strings 檔案新增至設定索引鍵和值的每個資料夾CFBundleDisplayName

注意

相較於將個別檔案設定為 BundleResource 建置動作,您可以將下列 XML 新增至您應用程式的專案 (.csproj) 檔案,將特定資料夾的內容設定為此建置動作:

<ItemGroup Condition="$(TargetFramework.Contains('-ios'))">
  <BundleResource Include="Platforms\iOS\Resources\**" TargetPath="%(RecursiveDir)%(Filename)%(Extension)" />
</ItemGroup>

本範例會將 Platform\iOS\Resources 資料夾中的任何內容,包括子資料夾中的內容設定為 BundleResource 建置動作。 它也會使用此建置動作來設定每個檔案的輸出路徑。

本地化字串值的語法如下:

/* comment */
"key"="localized-value";

您應該逸出字串中的下列字元:

  • \" 引言
  • \\ 反斜杠
  • \n 換行符

因此,若要將應用程式名稱當地語系化,請建立 InfoPlist.strings 檔案,並將索引鍵的值 CFBundleDisplayName 新增至檔案:

/* French */
CFBundleDisplayName="Maisons";

其他可用來本地化應用程式特定字串的索引鍵如下:

  • CFBundleName - 指定應用程式套件組合的簡短名稱,這些套件組合可能會在沒有的值 CFBundleDisplayName的情況下向用戶顯示。
  • CFBundleShortVersionString - 指定應用程式套件組合的版本號碼。
  • NSHumanReadableCopyright - 應用程式套件組合的著作權聲明。

此外,在您的項目檔中,您必須將 IPhoneResourcePrefix build 屬性設定為包含本地化資料夾的資料夾:

<PropertyGroup Condition="$(TargetFramework.Contains('-ios'))">
  <IPhoneResourcePrefix>Platforms/iOS/Resources</IPhoneResourcePrefix>
</PropertyGroup>

Mac Catalyst

在 Mac Catalyst 上,本地化的應用程式名稱會使用平臺\MacCatalyst\Resources 資料夾中的資料夾型命名慣例來儲存。 資料夾應該以語言和選擇性文化特性命名,後面接著 .lproj。 例如,西班牙文資料夾的名稱為 es.lproj將具有 BundleResource 建置動作的 InfoPlist.strings 檔案新增至設定索引鍵和值的每個資料夾CFBundleDisplayName

注意

相較於將個別檔案設定為 BundleResource 建置動作,您可以將下列 XML 新增至您應用程式的專案 (.csproj) 檔案,將特定資料夾的內容設定為此建置動作:

<ItemGroup Condition="$(TargetFramework.Contains('-maccatalyst'))">
  <BundleResource Include="Platforms\MacCatalyst\Resources\**" TargetPath="%(RecursiveDir)%(Filename)%(Extension)" />
</ItemGroup>

本範例會將 Platforms\MacCatalyst\Resources 資料夾中的任何內容,包括子資料夾中的內容設定為 BundleResource 建置動作。 它也會使用此建置動作來設定每個檔案的輸出路徑。

本地化字串值的語法如下:

/* comment */
"key"="localized-value";

您應該逸出字串中的下列字元:

  • \" 引言
  • \\ 反斜杠
  • \n 換行符

因此,若要將應用程式名稱當地語系化,請建立 InfoPlist.strings 檔案,並將索引鍵的值 CFBundleDisplayName 新增至檔案:

/* French */
CFBundleDisplayName="Maisons";

其他可用來本地化應用程式特定字串的索引鍵如下:

  • CFBundleName - 具體說明應用程式套件組合的簡短名稱,這些套件組合可能會在沒有的值 CFBundleDisplayName的情況下向用戶顯示。
  • CFBundleShortVersionString - 指定應用程式套件組合的版本號碼。
  • NSHumanReadableCopyright - 應用程式套件組合的著作權聲明。

此外,在您的項目檔中,您必須將 IPhoneResourcePrefix build 屬性設定為包含本地化資料夾的資料夾:

<PropertyGroup Condition="$(TargetFramework.Contains('-maccatalyst'))">
  <IPhoneResourcePrefix>Platforms/MacCatalyst/Resources</IPhoneResourcePrefix>
</PropertyGroup>

Windows

在 Windows 上,應用程式名稱會在您的應用程式套件指令清單中定義。 本地化應用程式名稱需要您先指定應用程式的預設語言,然後針對您想要支援的每個地區設定建立字串資源檔。 接著,您可以使用 URI 配置,在應用程式套件指令清單中取用代表當地語系化應用程式名稱的 ms-resource 字串資源。

如需在應用程式套件指令清單中當地語系化字串的詳細資訊,請參閱 在 UI 和應用程式套件指令清單中當地語系化字串。

指定預設語言

若要本地化應用程式名稱,您的 Windows 應用程式必須先指定預設語言。 如果找不到特定語言的當地語系化資源,則會使用其資源的語言。 若要指定預設語言:

  1. 在 方案總管 中,開啟套件指令清單編輯器中的 Packageappxmanifest 檔案。

  2. 在套件指令清單編輯器的 [應用程式] 索引標籤上,將 [預設語言] 欄位設定為您選擇的預設語言:

    Screenshot of setting the default language of a Windows app in the package manifest.

  3. 儲存您的變更。

您至少需要為預設語言的應用程式名稱提供字串資源。 如果找不到使用者慣用語言或顯示語言設定的較佳相符專案,就會載入此資源。

建立 Windows 資源檔

在 Windows 上,當地語系化的應用程式名稱應該儲存在每個地區設定的 Windows 資源檔中。 Windows 資源文件是擴展名為 .resw 的 XML 檔案,會編譯成二進位格式,並儲存在 .pri 檔案中每個地區設定的 .resw 檔案都應該命名為 Resources.resw,並使用 Platform\Windows\Strings 資料夾中的資料夾型命名慣例來儲存。 資料夾應該以語言和選擇性文化特性命名。 例如,西班牙文資料夾的名稱為 es ,而墨西哥地區設定資料夾應命名為 es-MX

目前沒有 Visual Studio 專案範本,可用於在 .NET MAUI 應用程式中建立 Windows 資源檔。 因此,若要為每個地區設定建立 Windows 資源檔:

  1. .NET MAUI 應用程式專案的 [平臺\Windows ] 資料夾中,建立 Strings 資料夾。

  2. Strings 資料夾中,為每個地區設定建立資料夾。

  3. 在每個地區設定的資料夾中,建立名為 Resources.resw 的檔案,其中包含下列 XML:

    <?xml version="1.0" encoding="utf-8"?>
    <root>
      <!--
        Microsoft ResX Schema
    
        Version 2.0
    
        The primary goals of this format is to allow a simple XML format
        that is mostly human readable. The generation and parsing of the
        various data types are done through the TypeConverter classes
        associated with the data types.
    
        Example:
    
        ... ado.net/XML headers & schema ...
        <resheader name="resmimetype">text/microsoft-resx</resheader>
        <resheader name="version">2.0</resheader>
        <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
        <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
        <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
        <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
        <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
            <value>[base64 mime encoded serialized .NET Framework object]</value>
        </data>
        <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
            <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
            <comment>This is a comment</comment>
        </data>
    
        There are any number of "resheader" rows that contain simple
        name/value pairs.
    
        Each data row contains a name, and value. The row also contains a
        type or mimetype. Type corresponds to a .NET class that support
        text/value conversion through the TypeConverter architecture.
        Classes that don't support this are serialized and stored with the
        mimetype set.
    
        The mimetype is used for serialized objects, and tells the
        ResXResourceReader how to depersist the object. This is currently not
        extensible. For a given mimetype the value must be set accordingly:
    
        Note - application/x-microsoft.net.object.binary.base64 is the format
        that the ResXResourceWriter will generate, however the reader can
        read any of the formats listed below.
    
        mimetype: application/x-microsoft.net.object.binary.base64
        value   : The object must be serialized with
                : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
                : and then encoded with base64 encoding.
    
        mimetype: application/x-microsoft.net.object.soap.base64
        value   : The object must be serialized with
                : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
                : and then encoded with base64 encoding.
    
        mimetype: application/x-microsoft.net.object.bytearray.base64
        value   : The object must be serialized into a byte array
                : using a System.ComponentModel.TypeConverter
                : and then encoded with base64 encoding.
        -->
      <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
        <xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
        <xsd:element name="root" msdata:IsDataSet="true">
          <xsd:complexType>
            <xsd:choice maxOccurs="unbounded">
              <xsd:element name="metadata">
                <xsd:complexType>
                  <xsd:sequence>
                    <xsd:element name="value" type="xsd:string" minOccurs="0" />
                  </xsd:sequence>
                  <xsd:attribute name="name" use="required" type="xsd:string" />
                  <xsd:attribute name="type" type="xsd:string" />
                  <xsd:attribute name="mimetype" type="xsd:string" />
                  <xsd:attribute ref="xml:space" />
                </xsd:complexType>
              </xsd:element>
              <xsd:element name="assembly">
                <xsd:complexType>
                  <xsd:attribute name="alias" type="xsd:string" />
                  <xsd:attribute name="name" type="xsd:string" />
                </xsd:complexType>
              </xsd:element>
              <xsd:element name="data">
                <xsd:complexType>
                  <xsd:sequence>
                    <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
                    <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
                  </xsd:sequence>
                  <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
                  <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
                  <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
                  <xsd:attribute ref="xml:space" />
                </xsd:complexType>
              </xsd:element>
              <xsd:element name="resheader">
                <xsd:complexType>
                  <xsd:sequence>
                    <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
                  </xsd:sequence>
                  <xsd:attribute name="name" type="xsd:string" use="required" />
                </xsd:complexType>
              </xsd:element>
            </xsd:choice>
          </xsd:complexType>
        </xsd:element>
      </xsd:schema>
      <resheader name="resmimetype">
        <value>text/microsoft-resx</value>
      </resheader>
      <resheader name="version">
        <value>2.0</value>
      </resheader>
      <resheader name="reader">
        <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
      </resheader>
      <resheader name="writer">
        <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
      </resheader>
    </root>
    

    注意

    Windows 資源檔使用 的 PRIResource建置動作。 此建置動作不需要在 .NET MAUI 應用程式中的每個 .resw 檔案上設定,因為它已隱含套用。

  4. 開啟每個 Resources.resw 檔案,並新增代表應用程式名稱的字串資源:

    Screenshot of the resw file editor in Visual Studio on Windows.

    注意

    資源標識符不區分大小寫,而且每個資源文件必須是唯一的。

  5. 儲存每個 Windows 資源檔。

下列螢幕快照顯示必要資料夾和檔案結構的範例:

Screenshot of the localized folder structure in Visual Studio for strings on Windows.

取用本地化的應用程式名稱

您可以使用 URI 設定來取用代表本地化應用程式名稱的 ms-resource 字串資源:

  1. 在 方案總管 中,開啟套件指令清單編輯器中的 Packageappxmanifest 檔案。

  2. 在套件指令清單編輯器的 [應用程式] 索引標籤上,將 [顯示名稱] 字段設定為 ms-resource: ,後面接著識別應用程式名稱的字串資源名稱:

    Screenshot of setting the localized app name in the package manifest on Windows.

  3. 儲存您的變更。

重要

如果您的 .resw 檔案儲存在 .NET MAUI 應用程式專案的不同元件中,您必須指定資源名稱的完整路徑。 這會使用 格式 ms-resource:Assembly/ResourceFilename/Resource

由右至左當地語系化

流程方向或版面配置方向是眼睛掃描頁面上 UI 元素的方向。 某些語言 (例如阿拉伯文和希伯來文) 需要將 UI 項目配置為從右至左的文字方向。 .NET MAUI 應用程式會根據選取的語言和區域自動遵守裝置的流程方向。 如需如何根據裝置地區設定擷取裝置流程方向的資訊,請參閱 取得配置方向

若要覆寫應用程式的流程方向,請設定 Window.FlowDirection 屬性。 或者,請根據每個元素設定 VisualElement.FlowDirection 屬性。 這些屬性會取得或設定UI元素在控制其配置的任何父元素內流動的方向,而且應該設定為其中 FlowDirection 一個列舉值:

  • LeftToRight
  • RightToLeft
  • MatchParent

FlowDirection 元素上的 屬性 RightToLeft 設定為 ,會將對齊方式設定為右邊、從右至左的閱讀順序,以及控件的版面配置從右至左流動。

警告

在運行時間變更 FlowDirection 屬性會導致影響效能的昂貴版面配置程式。

FlowDirection預設屬性值為 MatchParent。 因此,項目會從視覺化樹狀結構中的父代繼承 FlowDirection 屬性值,且任何項目都可以覆寫它從其父代所取得的值。

提示

如果您需要變更流程方向,請在窗口、頁面或根版面配置上設定 FlowDirection 屬性。 這會導致應用程式、頁面或根配置中包含的所有元素都適當地回應流程方向。

平台設定

特定平台設定需要啟用由右至左的地區設定。

Android

使用 .NET MAUI 應用程式專案範本建立的應用程式會自動包含從右至左地區設定的支援。 在應用程式的 AndroidManifest.xml 檔案的節點上,屬性會true<application>啟用android:supportsRtl此支援:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android">
    <application ... android:supportsRtl="true" />
    ...
</manifest>

然後,藉由將裝置或模擬器變更為使用由右至左的語言,即可測試從右至左的當地語系化。 或者,如果您已在 設定 應用程式中啟用開發人員選項,您可以在 設定 > 開發人員選項啟用強制 RTL 版面配置方向。 如需設定開發人員選項的詳細資訊,請參閱 在 developer.android.com 上設定裝置上的開發人員選項

iOS 和 Mac Catalyst

您應將必要的由右至左地區設定作為支援語言新增至 Info.plistCFBundleLocalizations 索引鍵的陣列項目。 下列範例顯示阿拉伯文已新增到 CFBundleLocalizations 索引鍵的陣列:

<key>CFBundleLocalizations</key>
<array>
    <string>en</string>
    <string>ar</string>
</array>

接著,將裝置或模擬器上的語言和區域變更為 Info.plist 中指定的由右至左地區設定,即可測試從右至左的當地語系化。

Windows

您應在 Package.appxmanifest 檔案的 <Resources> 節點中指定所需的語言資源。 將取代 <Resource Language="x-generate"><Resource /> 每個支援語言的專案。 例如,下列標記指定可以使用 「en」 和 「ar」 本地化的資源:

<Resources>
    <Resource Language="en" />
    <Resource Language="ar" />
</Resources>

您可以將裝置語言和地區變更為適當的由右至左地區設定,以測試由右至左當地語系化。

測試當地語系化

在運行時間,您的應用程式會根據 屬性所 CurrentUICulture 指定的文化特性,在每個線程上載入適當的當地語系化資源。

測試當地語系化是透過在每個裝置上變更 設定 應用程式中的裝置語言來達成最佳目的。

警告

雖然可以在程式代碼中設定的值 CurrentUICulture ,但產生的行為跨平臺不一致,因此不建議進行測試。