共用方式為


由右至左當地語系化

從右至左的當地語系化新增對應用程式的從右至左流程方向 Xamarin.Forms 的支援。

注意

從右至左當地語系化需要 iOS 9 或更新版本,以及 Android 的 API 17 或更新版本。

流動方向即為眼睛掃描頁面 UI 元素的方向。 某些語言 (例如阿拉伯文和希伯來文) 需要將 UI 項目配置為從右至左的文字方向。 這可以透過設定 VisualElement.FlowDirection 屬性來完成。 此屬性會取得或設定 UI 項目在任何父項目中的文字方向,以控制其配置,且應該設為其中一個 FlowDirection 列舉值:

將項目上的 FlowDirection 屬性設為 RightToLeft 時,一般會設定為靠右對齊、由右至左的讀取順序,以及從右至左文字方向的控制項配置:

阿拉伯文中的 TodoItemPage 與由右至左的流程方向

提示

您應該只在初始配置上設定 FlowDirection 屬性。 在執行階段變更此值時,會導致佔用大量資源的配置程序,而影響效能。

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

提示

針對從右至左的語言當地語系化應用程式時,請在頁面或根配置上設定 FlowDirection 屬性。 這可讓頁面上或根配置內含的所有項目適當地回應文字方向。

遵守裝置的文字方向

開發人員應該根據所選語言和地區,明確選擇要遵守的裝置文字方向;系統並不會自動選擇。 您可以在頁面上或根配置上將 FlowDirection 屬性設為 staticDevice.FlowDirection 值,來完成上述作業:

<ContentPage ... FlowDirection="{x:Static Device.FlowDirection}"> />
this.FlowDirection = Device.FlowDirection;

如此一來,頁面或根配置的所有子項目都預設會繼承 Device.FlowDirection 值。

平台設定

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

iOS

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

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

Info.plist 支援的語言

如需詳細資訊,請參閱在 iOS 中的當地語系化基本概念

您可以將 Info.plist 中所指定的裝置/模擬器語言和地區變更為由右至左地區設定,以測試由右至左當地語系化。

警告

請注意,在 iOS 上將語言和地區變更為由右至左地區設定時,如果您未包含地區設定所需的資源,則任何 DatePicker 檢視都會擲回例外狀況。 例如,當測試具有 DatePicker 的阿拉伯文應用程式時,請務必選取 [iOS 組建] 窗格 [國際化] 區段中的 [中東]

Android

您應更新應用程式的 AndroidManifest.xml 檔案,以讓 <uses-sdk> 節點將 android:minSdkVersion 屬性設為 17,且 <application> 節點將 android:supportsRtl 屬性設為 true

<?xml version="1.0" encoding="utf-8"?>
<manifest ... >
    <uses-sdk android:minSdkVersion="17" ... />
    <application ... android:supportsRtl="true">
    </application>
</manifest>

然後,透過將裝置/模擬器變更為使用從右至左的語言,或在 設定 > 開發人員選項啟用強制 RTL 版面配置方向,即可測試從右至左的當地語系化。

通用 Windows 平台 (UWP)

您應在 Package.appxmanifest 檔案的 <Resources> 節點中指定所需的語言資源。 下列範例顯示阿拉伯文已新增到 <Resources> 節點:

<Resources>
    <Resource Language="x-generate"/>
    <Resource Language="en" />
    <Resource Language="ar" />
</Resources>

此外,UWP 要求必須在 .NET Standard 程式庫中明確定義應用程式的預設文化特性。 您可以將 AssemblyInfo.cs 或其他類別中的 NeutralResourcesLanguage 屬性設為預設文化特性,以完成上述作業:

using System.Resources;

[assembly: NeutralResourcesLanguage("en")]

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

限制

Xamarin.Forms 從右至左的當地語系化目前有一些限制:

  • NavigationPage 按鈕位置、工具列項目位置及轉換動畫均由裝置的地區設定控制,而非由 FlowDirection 屬性控制。
  • CarouselPage 撥動方向無法翻轉。
  • Image 視覺內容無法翻轉。
  • WebView 內容不會遵守 FlowDirection 屬性。
  • 必須新增 TextDirection 屬性,以控制文字的對齊方式。

iOS

Android

UWP

強制由右至左版面配置

修改個別平台專案,即可強制 Xamarin.iOS 和 Xamarin.Android 應用程式一律使用由右至左的版面配置,而不論裝置設定為何。

iOS

您可以藉由修改 AppDelegate 類別,強制 Xamarin.iOS 應用程式一律使用由右至左的版面配置,如下所示:

  1. 將函 IntPtr_objc_msgSend 式宣告為類別 AppDelegate 中的第一行:

    [System.Runtime.InteropServices.DllImport(ObjCRuntime.Constants.ObjectiveCLibrary, EntryPoint = "objc_msgSend")]
    internal extern static IntPtr IntPtr_objc_msgSend(IntPtr receiver, IntPtr selector, UISemanticContentAttribute arg1);
    
  2. IntPtr_objc_msgSendFinishedLaunching 方法呼叫 函式,再從 FinshedLaunching 方法傳回:

    bool result = base.FinishedLaunching(app, options);
    
    ObjCRuntime.Selector selector = new ObjCRuntime.Selector("setSemanticContentAttribute:");
    IntPtr_objc_msgSend(UIView.Appearance.Handle, selector.Handle, UISemanticContentAttribute.ForceRightToLeft);
    
    return result;
    

此方法適用於一律需要由右至左配置的應用程式,並移除設定 FlowDirection 屬性的需求。

如需方法的詳細資訊 IntrPtr_objc_msgSend ,請參閱 Xamarin.iOS 中的 Objective-C 選取器。

Android

Xamarin.Android 應用程式可以藉由修改 MainActivity 類別來包含下列這一行,強制使用由右至左的版面配置:

Window.DecorView.LayoutDirection = LayoutDirection.Rtl;

注意

此方法需要設定應用程式以支援從右至左的版面配置。 如需詳細資訊,請參閱 Android平台設定

此方法適用於一律需要由右至左配置的應用程式,並移除為大部分控件設定 FlowDirection 屬性的需求。 不過,某些控件,例如 CollectionView,不尊重 LayoutDirection 屬性,但仍需要 FlowDirection 設定 屬性。

Xamarin.University 的由右至左語言支援

Xamarin.Forms 3.0 從右至左支援影片