下列几节说明了如何开发 CTL 应用程序。
复合字符串的方向被存储起来,以便使数据结构对于描述从左到右的语言(如英语、西班牙语、法语和德语)的文本或者从右到左的语言(如希伯来语和阿拉伯语)的文本同样有用。在 Motif 应用程序中,可以使用 VendorShell 或 MenuShell 中的 XmNlayoutDirection 资源来设置布局方向。管理器和原始小部件(以及小配件)也具有 XmNlayoutDirection 资源。缺省值从具有相同资源的最近的祖先继承。
如果是 XmText 小部件,则必须指定垂直方向及水平方向。将 layoutDirection 设置为 XmRIGHT_TO_LEFT 将会使字符串方向成为从右到左,而光标则垂直向下移动。如果垂直方向重要且要求从顶到底对齐,确保指定 XmRIGHT_TO_LEFT_TOP_TO_BOTTOM。本设置将组件布局首先指定为从右到左,然后从上到下,从而产生所需的行为。
XmText 和 TextField 小部件的行为也受 XmNalignment 和 XmNlayoutModifier XmRendition 资源的影响。这些资源与 XmNlayoutDirection 共同控制文本小部件的布局行为。图 6–2 中阐释了此行为。
该图中使用的输入字符串是:
下图中 XmNlayoutModifier 字符串 @ls orientation=设置值如左列中所示。
如插图所示,XmNalignment 规定文本是否与布局方向一起右对齐或左对齐。XmNlayoutModifier 将文本分成多段,并根据定向值将它们从左到右或从右到左排列。换句话说,如果 XmNlayoutDirection 是 XmRIGHT_TO_LEFT,并且 XmNAlignment 值是 XmALIGNMENT_BEGINNING,则此字符串右对齐。
下列代码使用标记为“ArabicShaped”的“绘制”创建 XmNlabelString 为 XmCHARSET_TEXT 类型的 XmLabel。使用“ar”(对应于阿拉伯语言环境的语言环境名称)的 XmNlayoutAttrObject 以及布局修饰符字符串来创建“绘制”。该布局修饰符字符串为输出缓冲指定了 NUMERALS_CONTEXTUAL 的 Numerals 值和 “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);
下列代码使用一个 Rendition创建 TextField 小部件和 RenderTable。XmNlayoutAttrObject 和 XmNlayoutModifier 伪资源均未指定,因此缺省为 NULL。此值意味着与“Rendition”关联的布局对象属于缺省语言环境(如果存在)。
要使此实例正常工作,该语言环境必须设置为代码集是 ISO 8859-6,并且特定于该语言环境的布局模块可支持 IMPLICIT_BASIC 算法。Rendition 的 LayoutObject 的 ImplicitAlg 值通过 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。
在创建绘制表之前,应用程序必须至少先创建一个属于该表的绘制。顾名思义, 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);