國際語言環境指南

控制版面配置方向

您可以儲存複合字串的方向,這樣資料結構就可以用於描述從左至右方向的文字 (例如,英文、西班牙文、法文和德文)或是從右至左方向文字 (例如,希伯來文和阿拉伯文)。在 Motif 應用程式中,您可以從 VendorShell 或 MenuShell,使用 XmNlayoutDirection 資源來設定版面配置方向。「管理員」及「原始」視窗元件和 Gadget 一樣也擁有 XmNlayoutDirection 資源。預設值是得自於具有相同資源的最接近祖先。

在使用 XmText 視窗元件的情況下,您必須指定垂直方向以及水平方向。將 layoutDirection 設定為 XmRIGHT_TO_LEFT,可以讓字串方向成為從右至左,但是游標會垂直向下。如果垂直方向很重要,而且您需要由上至下的對齊方式,請確認指定了 XmRIGHT_TO_LEFT_TOP_TO_BOTTOM。這個設定會指定先從右至左,再由上至下來配置元件,並產生期望的行為。

XmTextTextField 視窗元件的行為同樣受到 XmRenditionXmNalignmentXmNlayoutModifier 資源的影響。這些資源 (除了 XmNlayoutDirection) 會一起控制「文字」視窗元件的版面配置行為。這個行為將說明於圖 6–2

該圖所使用的輸入字串為:

本圖例展示英文和阿拉伯文字元在同一行上的雙向文字版面配置。

下圖 XmNlayoutModifier 字串 @ls orientation= 的設定值會顯示於左邊欄位。

圖 6–2 版面配置方向

本圖例顯示從左至右以及從右至左的頭尾對齊方式。

如圖所示,XmNalignment 會指示文字配合版面配置方向向右對齊或向左對齊。XmNlayoutModifier 會將文字分成幾個段落,並依據方向值將它們由左至右或由右至左排列。換言之,如果 XmNlayoutDirectionXmRIGHT_TO_LEFT,且 XmNAlignment 值是 XmALIGNMENT_BEGINNING,該字串就會向右對齊。


範例 6–1 建立 Rendition

下列的程式碼,使用其標記是「ArabicShaped」的 Rendition,建立一個其 XmNlabelStringXmCHARSET_TEXT 類型的 XmLabel。此 Rendition 是使用「ar」(相對應到阿拉伯文語言環境的語言環境名稱) 的 XmNlayoutAttrObject以及為輸出緩衝區指定 NUMERALS_CONTEXTUALNumerals 值和「iso8859-6」的 ShapeCharset 值之版面配置修飾元字串來建立的。

語言環境特定的版面配置模組會將其本身的輸入文字,轉換為使用 16 位元 Unicode 字碼集進行編碼的實體字元輸出緩衝區。因為已經指定明確版面配置語言環境,這段文字會獨立於執行階段語言環境設定適當地產生。在此範例中,輸入是使用 ISO 8859-6 來編碼。

int n;
Arg args[10];
Widget w;
XmString labelString;
XmRendition rendition;
XmStringTag renditionTag;
XmRenderTable renderTable;
      /* alef lam baa noon taa - iso8859-6 */
labelString = XmStringGenerate("\307\344\310\346\312\", NULL
			                          XmCHARSET_TEXT, "ArabicShaped");
w = XtVaCreateManagedWidget("a label", xmLabelWidgetClass, parent,
                             XmNlabelString, labelString,
		                          XmNlabelType, XmSTRING,
                             NULL);
n = 0;
XtSetArg(args[n], XmNfontName, "-*-*-medium-r-normal-*-24-*-*-*-*-*-*");
      n++;
XtSetArg(args[n], XmNfontType, XmFONT_IS_XOC); n++;
XtSetArg(args[n], XmNlayoutAttrObject, "ar"); n++;
XtSetArg(args[n], XmNlayoutModifier, 
          "@ls numerals=:contextual, shapecharset=iso8859-6"); n++;
renditionTag = (XmStringTag) "ArabicShaped";
rendition = XmRenditionCreate(w, renditionTag, argcs
s, n);
renderTable = 
    XmRenderTableAddRenditions(NULL, &rendition, 1, XmREPLACE_MERGE);
XtVaSetValues(w, XmNrenderTable, renderTable, NULL);


範例 6–2 編輯 Rendition

下列程式碼使用單一 Rendition 來建立 TextField 視窗元件和 RenderTable。XmNlayoutAttrObjectXmNlayoutModifier 兩個虛擬資源都未被指定,因此將預設為 NULL。這個值表示與 Rendition 有關聯的版面配置物件屬於預設語言環境,若其存在的話。

如果要順利執行這個範例,語言環境必須設定成具有整個字碼集是 ISO 8859-6,且其語言環境特定版面配置模組可以支援 IMPLICIT_BASIC 演算法。此 Rendition 的 LayoutObjectImplicitAlg 值已被修改,修改方式是透過 Rendition 的 XmNlayoutModifier 虛擬資源。

int n;
Arg args[10];
Widget w;
	XmRendition rendition;
XmStringTag renditionTag;
XmRenderTable renderTable;
w = XmCreateTextField(parent, "text field", args, 0);
n = 0;
	XtSetArg(args[n], XmNfontName, "-*-*-medium-r-normal-*-24-*-*-*-*-*-*-*");
     n++;
	XtSetArg(args[n], XmNfontType, XmFONT_IS_XOC); n++;
renditionTag = (XmStringTag) "ArabicShaped";
rendition = XmRenditionCreate(w, renditionTag, args, n);
renderTable = 
    XmRenderTableAddRenditions(NULL, &rendition, 1, XmREPLACE_MERGE);
XtVaSetValues(w, XmNrenderTable, renderTable, NULL);
	....
n = 0;
XtSetArg(args[n], XmNlayoutModifier, "@ls implicitalg=basic");
     n++;
XmRenditionUpdate(rendition, args, n);