国际语言环境指南

控制布局方向

复合字符串的方向被存储起来,以便使数据结构对于描述从左到右的语言(如英语、西班牙语、法语和德语)的文本或者从右到左的语言(如希伯来语和阿拉伯语)的文本同样有用。在 Motif 应用程序中,可以使用 VendorShell 或 MenuShell 中的 XmNlayoutDirection 资源来设置布局方向。管理器和原始小部件(以及小配件)也具有 XmNlayoutDirection 资源。缺省值从具有相同资源的最近的祖先继承。

如果是 XmText 小部件,则必须指定垂直方向及水平方向。将 layoutDirection 设置为 XmRIGHT_TO_LEFT 将会使字符串方向成为从右到左,而光标则垂直向下移动。如果垂直方向重要且要求从顶到底对齐,确保指定 XmRIGHT_TO_LEFT_TOP_TO_BOTTOM。本设置将组件布局首先指定为从右到左,然后从上到下,从而产生所需的行为。

XmTextTextField 小部件的行为也受 XmNalignmentXmNlayoutModifier XmRendition 资源的影响。这些资源与 XmNlayoutDirection 共同控制文本小部件的布局行为。图 6–2 中阐释了此行为。

该图中使用的输入字符串是:

下图阐释了同一行中英文字符和阿拉伯字符的双向文本布局。

下图中 XmNlayoutModifier 字符串 @ls orientation=设置值如左列中所示。

图 6–2 布局方向

此图说明从左到右文本和从右到左文本的开头与结尾对齐方式。

如插图所示,XmNalignment 规定文本是否与布局方向一起右对齐或左对齐。XmNlayoutModifier 将文本分成多段,并根据定向值将它们从左到右或从右到左排列。换句话说,如果 XmNlayoutDirectionXmRIGHT_TO_LEFT,并且 XmNAlignment 值是 XmALIGNMENT_BEGINNING,则此字符串右对齐。


实例 6–1 创建绘制

下列代码使用标记为“ArabicShaped”的“绘制”创建 XmNlabelStringXmCHARSET_TEXT 类型的 XmLabel。使用“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创建 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);