國際語言環境指南

開發 CTL 應用程式

下列章節說明如何開發 CTL 應用程式。

控制版面配置方向

您可以儲存複合字串的方向,這樣資料結構就可以用於描述從左至右方向的文字 (例如,英文、西班牙文、法文和德文)或是從右至左方向文字 (例如,希伯來文和阿拉伯文)。在 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);

在資源檔案中建立 Render 表格

Rendition 以及 render 表格應該在資源檔案中,針對適當國際化的應用程式進行指定。當您將 render 表格指定於一個檔案時,程式的二進位碼就可因應指定語言環境的特殊需求而獨立產生,且可輕易地依照該語言環境需求完成自訂。

Render 表格會以下列語法指定於資源檔案中 :resource_spec:[tag[,tag]*]

其中 tag 是某些適合 XmNtag rendition 資源的字串。

這一行將建立初始 render 表格,其將包含一個或更多個指定的 rendition。這些 rendition 將附加指定標記:

resource_spec[*|.] rendition[*|.]resource_name:value

下列範例將說明與 XmRendition (可以使用資源檔案設定) 相關聯的 CTL 資源。fontType 必須設定為 FONT_IS_XOC,才能使版面配置物件生效。layoutModifier (使用 @ls 指定) 已經由 rendition 物件傳遞至版面配置物件。

如需可以使用 layoutModifier 在版面配置上設定之資源的清單,請參閱「CAE Specification: Portable Layout Services: Context-dependent and Directional Text」,The Open Group:Feb 1997;ISBN 1-85912-142-X;document number C616。


範例 6–3 在應用程式中建立 Render 表格

在建立 render 表格之前,應用程式必須先建立至少一個該表格中的一個 rendition。XmRenderTableAddRenditions() 函式一如其名所示,也是使用新的 rendition 來強化 render 表格。若要建立新的 render 表格,請呼叫 XmRenderTableAdd s() 函式,並以 NULL 引數來替換現有的 render 表格。

下列程式碼將使用 rendition,將 XmNfontType 設定為 XmFONT_IS_XOC,來建立 render 表格。

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=nominal:contextual, shapecharset=iso8859-6"); n++;
renditionTag = (XmStringTag) "ArabicShaped";
rendition = XmRenditionCreate(w, renditionTag, args, n);
renderTable = 
    XmRenderTableAddRenditions(NULL, &rendition, 1, XmREPLACE);
XtVaSetValues(w, XmNrenderTable, renderTable, NULL);