由右至左當地語系化
從右至左的當地語系化新增對應用程式的從右至左流程方向 Xamarin.Forms 的支援。
注意
從右至左當地語系化需要 iOS 9 或更新版本,以及 Android 的 API 17 或更新版本。
流動方向即為眼睛掃描頁面 UI 元素的方向。 某些語言 (例如阿拉伯文和希伯來文) 需要將 UI 項目配置為從右至左的文字方向。 這可以透過設定 VisualElement.FlowDirection
屬性來完成。 此屬性會取得或設定 UI 項目在任何父項目中的文字方向,以控制其配置,且應該設為其中一個 FlowDirection
列舉值:
將項目上的 FlowDirection
屬性設為 RightToLeft
時,一般會設定為靠右對齊、由右至左的讀取順序,以及從右至左文字方向的控制項配置:
提示
您應該只在初始配置上設定 FlowDirection
屬性。 在執行階段變更此值時,會導致佔用大量資源的配置程序,而影響效能。
不具父代的項目其預設 FlowDirection
屬性值為 LeftToRight
,而具父代的項目其預設 FlowDirection
為 MatchParent
。 因此,項目會從視覺化樹狀結構中的父代繼承 FlowDirection
屬性值,且任何項目都可以覆寫它從其父代所取得的值。
提示
針對從右至左的語言當地語系化應用程式時,請在頁面或根配置上設定 FlowDirection
屬性。 這可讓頁面上或根配置內含的所有項目適當地回應文字方向。
遵守裝置的文字方向
開發人員應該根據所選語言和地區,明確選擇要遵守的裝置文字方向;系統並不會自動選擇。 將頁面上的屬性或根設定設定為 static
Device.FlowDirection
值,即可達成FlowDirection
此目的:
<ContentPage ... FlowDirection="{x:Static Device.FlowDirection}"> />
this.FlowDirection = Device.FlowDirection;
如此一來,頁面或根配置的所有子項目都預設會繼承 Device.FlowDirection
值。
平台設定
特定平台設定需要啟用由右至左的地區設定。
iOS
您應將必要的由右至左地區設定作為支援語言新增至 Info.plist 中 CFBundleLocalizations
索引鍵的陣列項目。 下列範例顯示阿拉伯文已新增到 CFBundleLocalizations
索引鍵的陣列:
<key>CFBundleLocalizations</key>
<array>
<string>en</string>
<string>ar</string>
</array>
如需詳細資訊,請參閱在 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
Stepper
方向由裝置的地區設定控制,而非由FlowDirection
屬性控制。EntryCell
文字對齊方式由裝置的地區設定控制,而非由FlowDirection
屬性控制。ContextActions
手勢和對齊方式無法反轉。
Android
SearchBar
方向由裝置的地區設定控制,而非由FlowDirection
屬性控制。ContextActions
位置由裝置的地區設定控制,而非由FlowDirection
屬性控制。
UWP
Editor
文字對齊方式由裝置的地區設定控制,而非由FlowDirection
屬性控制。FlyoutPage
子系不會繼承FlowDirection
屬性。ContextActions
文字對齊方式由裝置的地區設定控制,而非由FlowDirection
屬性控制。
強制由右至左版面配置
修改個別平台專案,即可強制 Xamarin.iOS 和 Xamarin.Android 應用程式一律使用由右至左的版面配置,而不論裝置設定為何。
iOS
您可以藉由修改 AppDelegate 類別,強制 Xamarin.iOS 應用程式一律使用由右至左的版面配置,如下所示:
將函
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);
IntPtr_objc_msgSend
從FinishedLaunching
方法呼叫 函式,再從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 從右至左支援影片