Board logo

标题: 使用 m17n 实现各国语言间代码移植(3) [打印本页]

作者: look_w    时间: 2018-5-19 15:11     标题: 使用 m17n 实现各国语言间代码移植(3)

m17n 简介从内部来说,m17n 库会被组织成几个应用程序接口(API):
m17n 库的使用与其他 Linux 或 UNIX 的库的使用相同。如果要使用这个库的所有特性,就需要在程序中包含 m17n.h 头文件,然后在链接选项中加上 -lm17n 选项,这可以在 Makefile 中实现。 如果只想使用 m17n 的一部分功能,Core、Shell、GUI 以及                        Miscellaneous API 每个都有单独的包含文件。不幸的是,m17n 并没有很多样例代码,很多明显引用它们的程序,例如可以识别 m17n 的应用程序,也只有两年的时间。然而,m17n 的软件开发包(SDK)确实包含了一个简单的程序,它可以使用各种编码来显示文件。我们可以查看一下所下载的 m17n 工具包中的 example 目录。在这个目录中,打开  mview.c 文件。这个文件的一部分如清单 2 所示。
清单 2. m17n 示例文件
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
...
325  M17N_INIT ();
326  if (merror_code != MERROR_NONE)
327    FATAL_ERROR ("%s\n", "Fail to initialize the m17n library.");
328  
329  /* Decide how to decode the input stream.  */
330  if (coding_name)
331    {
332      coding = mconv_resolve_coding (msymbol (coding_name));
333      if (coding == Mnil)
334        FATAL_ERROR ("Invalid coding: %s\n", coding_name);
335    }
336  else
337    coding = Mcoding_utf_8;
338  
339  mt = mconv_decode_stream (coding, fp);
340  fclose (fp);
341  if (! mt)
342    FATAL_ERROR ("%s\n", "Fail to decode the input file or stream!");
343  
344  {
345    MPlist *param = mplist ();
346    MFace *face = mface ();
347  
348    if (fontsize)
349      mface_put_prop (face, Msize, (void *) fontsize);
350    mplist_put (param, Mwidget, shell);
351    mplist_put (param, Mface, face);
352    frame = mframe (param);
353    m17n_object_unref (param);
354    m17n_object_unref (face);
355  }
356  
357  /* Create this widget hierarchy.
358     Shell - form -+- quit
359                   |
360                   +- viewport - text  */
361  
362  form = XtCreateManagedWidget ("form", formWidgetClass, shell, NULL, 0);
363  XtSetArg (arg[0], XtNleft, XawChainLeft);
364  XtSetArg (arg[1], XtNright, XawChainLeft);
365  XtSetArg (arg[2], XtNtop, XawChainTop);
366  XtSetArg (arg[3], XtNbottom, XawChainTop);
367  XtSetArg (arg[4], XtNaccelerators, XtParseAcceleratorTable (quit_action));
368  quit = XtCreateManagedWidget ("quit", commandWidgetClass, form, arg, 5);
369  XtAddCallback (quit, XtNcallback, QuitProc, NULL);
370  
371  viewport_width = (int) mframe_get_prop (frame, Mfont_width) * 80;
372  viewport_height
373    = ((int) mframe_get_prop (frame, Mfont_ascent)
374       + (int) mframe_get_prop (frame, Mfont_descent)) * 24;
375  XtSetArg (arg[0], XtNallowVert, True);
376  XtSetArg (arg[1], XtNforceBars, False);
377  XtSetArg (arg[2], XtNfromVert, quit);
378  XtSetArg (arg[3], XtNtop, XawChainTop);
379  XtSetArg (arg[4], XtNbottom, XawChainBottom);
380  XtSetArg (arg[5], XtNright, XawChainRight);
381  XtSetArg (arg[6], XtNwidth, viewport_width);
382  XtSetArg (arg[7], XtNheight, viewport_height);
383  viewport = XtCreateManagedWidget ("viewport", viewportWidgetClass, form,
384                                    arg, 8);
385  
386  /* Before creating the text widget, we must calculate the height of
387     the M-text to draw.  */
388  control.two_dimensional = 1;
389  control.enable_bidi = 1;
390  control.disable_caching = 1;
391  control.max_line_width = viewport_width;
392  mdraw_text_extents (frame, mt, 0, mtext_len (mt), &control,
393                      NULL, NULL, &metric);
...




下面对这些代码详细介绍一下:
总而言之,上面对这段代码片段的简短分析就说明了在标准的 X 应用程序中通常要执行哪些操作。在很多情况中,创建一个多语言的应用程序只需要很少的额外代码就可以实现,这需要采用 m17n 的函数,而不是传统的 X 调用。
展望如果没有可以构建 m17n 代码的系统,也不要烦恼。您仍然可以通过在线 m17n 呈现演示来体验这个库的作用(参看  中的链接)。
据开发人员说,他们正在继续在 GTK+ 中集成 m17n —— 这是扩宽 m17n 的认可程度以及影响力的下一个必不可少的步骤。现在,m17n 项目缺少样例代码供参考和扩展。建立更好的文档也是另外一个需要做的工作,这与为主流平台提供二进制文件一样重要。然而,m17n 确实承诺会对各个省的方言也能够实现 WYSIEYG 的编辑。这对任何语言来说都是个好消息。
个人计算机已经不再是什么新奇的东西了。实际上,在不到 20 年的时间内,计算机已经成为了家庭的日常用品 —— 只不过它不是什么衣服之类的东西,而是用来管理信息的工具。然而,有些国家计算机的获得和使用还并不普遍。为了平衡这种不平等,需要让这些国家能够获得负担得起的各种计算机硬件和软件。另外,还要保证本土居民能够以本地方言来使用计算机。
m17n 库构建在 Unicode 和其他标准之上,用来根据手写语言的规则画出任意复杂的拼字法。它将代码与字符的格式区分开来,因此相同的代码可以反复使用,甚至是在相同的应用程序中呈现不同的拼字法都可以。随着这些工作的不断进展,m17n 正在逐渐让计算机语言变成一种全球的方言。




欢迎光临 电子技术论坛_中国专业的电子工程师学习交流社区-中电网技术论坛 (http://bbs.eccn.com/) Powered by Discuz! 7.0.0