国际语言环境指南

开发 CTL 应用程序

下列几节说明了如何开发 CTL 应用程序。

控制布局方向

复合字符串的方向被存储起来,以便使数据结构对于描述从左到右的语言(如英语、西班牙语、法语和德语)的文本或者从右到左的语言(如希伯来语和阿拉伯语)的文本同样有用。在 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);

在资源文件中创建绘制表

对于正确国际化的应用程序,应在其资源文件中指定 Rendition 和绘制表。在文件中指定了绘制表后,程序二进制代码就与给定语言环境的特定需要无关,从而能够轻松地进行定制以满足本地需要。

绘制表是用以下语法在资源文件中指定的:resource_spec:[tag[,tag]*]

其中 tag 是适用于某个绘制的 XmNtag 资源的某个字符串。

该行将按指定要求创建包含一个或多个绘制的初始绘制表。这些绘制被附加到指定的标记上:

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

下例阐释了与 XmRendition 相关的 CTL 资源,这些资源可用资源文件来设置。fontType 必须设置为 FONT_IS_XOC 才能使布局对象生效。使用 @ls 指定的 layoutModifier 通过绘制对象传递给布局对象。

有关在布局对象中可以使用 layoutModifier 设置的资源的完整列表,请参见《CAE 规范:可移植布局服务:依赖于上下文的定向文本》。开放组:1997 年 2 月;ISBN 1-85912-142-X;文档号码 C616。


实例 6–3 在应用程序中创建绘制表

在创建绘制表之前,应用程序必须至少先创建一个属于该表的绘制。顾名思义, XmRenderTableAddRenditions() 函数还用于用新的绘制来增大绘制表。要创建新的绘制表,请使用 NULL 参数调用 XmRenderTableAddRenditions() 函数来替换现有的绘制表。

下列代码使用在将 XmNfontType 设置为 XmFONT_IS_XOC 时创建的绘制来创建一个绘制表。

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);