跳转到内容

FOSS 本地化/附录 A:关键概念

来自维基教科书,开放世界中的开放书籍

本附录简要介绍了本地化的关键概念,以便那些有兴趣将其语言的 FOSS 本地化的人,能够对所需知识有一个广泛的了解。下一个附录提供了开始所需的技术细节。

标准化

[编辑 | 编辑源代码]

当两个或多个实体交互时,共同约定至关重要。汽车驾驶员必须遵守交通规则以防止事故。人们需要关于语言和手势的共同约定来进行交流。同样,软件需要标准和协议才能无缝地互操作。在软件工程方面,在实现之前需要建立程序各个部分之间的契约。对于由来自不同背景的众多独立开发人员开发的系统,这些契约最为重要,对于跨平台互操作性也至关重要。

标准为全世界所有计算系统提供了这样的契约。软件开发人员需要遵守这些约定以防止误解。因此,标准化应该是任何软件开发的第一个步骤,包括本地化。

为了开始本地化,研究相关标准并将其贯穿整个项目是一个好主意。如今,已经开发了许多国际标准和规范来涵盖世界各地的语言。如果这些不符合项目的需要,可以考虑参与标准化活动。

ISO/IEC JTC1(国际标准化组织和国际电工委员会联合技术委员会 1)
一个关于信息技术国际标准的联合技术委员会。该委员会下设许多关于不同类别的分委员会(SC),这些分委员会又组成了工作组(WG)来处理标准的子类别。例如,ISO/IEC JTC1/SC2/WG2 是通用编码字符集(UCS)的工作组。但是,标准化过程以封闭的方式进行。如果国家标准机构是 ISO/IEC 成员,则可以提出项目的相关要求。否则,可能需要联系各个委员会。他们可能会要求以专家身份参与。JTC1/SC2(编码字符集)的信息在 http://anubis.dkuug.dk/JTC1/SC22 发布。有关 JTC1/SC22(编程语言、其环境和系统软件接口)的信息可以在 http://anubis.dkuug.dk/JTC1/SC22 找到。
Unicode 联盟:
一个致力于通用字符集的非营利组织。它与 ISO/IEC JTC1 分委员会密切相关。其网站位于 http://www.unicode.org,并提供贡献渠道。
自由标准组织
一个致力于通过开发和推广标准来加速 FOSS 使用的非营利组织。其网站位于 http://www.freestandards.org。它对参与开放。在它的保护伞下,有许多工作组,包括用于国际化http://www.openi18n.org)的 OpenI18N。

但是,请注意,国家键盘映射和输入/输出方法等问题并不在上述标准中涵盖。国家标准机构应该定义这些标准,或统一不同供应商使用的现有解决方案,以便用户能够从一致性中受益。

字符是表示任何特定语言文本数据的最基本单位。在数学术语中,字符集定义了语言中使用的所有字符的集合。在信息技术术语中,字符集必须根据某些约定(称为编码)在存储中以字节的形式编码。这些约定必须由数据发送者和接收者共同同意,以便信息保持完整和准确。

在 1970 年代,大多数程序使用的字符集由英语字母、十进制数字和一些标点符号组成。最广泛使用的编码是 7 位ASCII(美国信息交换标准代码),其中最多可以表示 128 个字符,这足以满足英语的需要。但是,当需要在计算机中使用非英语语言时,定义了其他编码。代码页的概念被设计为对ASCII的增强,通过添加字符作为第二个 7 位半,总共形成一个 8 位代码表。供应商为装饰目的和拉丁语重音符号定义了几个代码页。一些非欧洲语言通过这种策略添加,例如希伯来语和泰语。国家标准为字符编码定义了标准。

传统的编码系统不适合具有大型字符集和特殊复杂性的亚洲语言。例如,汉语、日语和韩语(CJK)使用的汉字编码,其总数尚未确定,其复杂程度要高得多。必须定义大量的代码页才能涵盖它们。此外,与其他单字节编码的兼容性是另一个重大挑战。这最终导致了一些用于 CJK 的多字节编码。

然而,拥有大量编码标准需要支持对软件开发人员来说是一个问题。因此,一群供应商同意共同努力,定义一个涵盖世界上所有语言字符的单一字符集,以便开发人员有一个单一的参考点,用户有一个单一的编码。因此,Unicode 联盟成立了。世界上的主要语言被添加到代码表中。后来,ISO 和 IEC 共同组成了 JTC1/SC2/WG2 来标准化代码表,该代码表以 ISO/IEC 10646 的形式发布。Unicode 也是工作组的成员,与 ISO 成员国的标准机构一起。Unicode 和 ISO/IEC 10646 是同步的,因此代码表相同。但是,Unicode 还提供额外的实现指南,例如字符属性、渲染、编辑、字符串排序等。

如今,许多应用程序已迁移到Unicode,并从支持新语言的明确定义中受益。Unicode 用户能够以自己的语言交换信息,特别是在互联网上,没有兼容性问题。

一旦定义了脚本的字符集和编码,使其在系统上生效的第一步就是显示它。在屏幕上渲染文本需要一些资源来描述字符的形状,即字体,还需要一些过程来根据脚本约定渲染字符图像。这个过程称为输出方法。本节将尝试涵盖这些要求的重要方面。

字符和字形

[编辑 | 编辑源代码]

字体是指一套字符集的字形。字形是字符或字符序列的视觉形式。区分字符和字形概念非常重要。对于某些文字系统,一个字符可能有多个变体,具体取决于上下文。在这种情况下,字体可能包含每个字符的多个字形,以便文本渲染器可以动态选择合适的字形。另一方面,诸如英文文本中的“ff”之类的连字概念也允许将某些字符序列绘制在一起。这引入了另一种将多个字符映射到单个字形的映射方式。

位图字体和矢量字体

[edit | edit source]

原则上,描述字体中的字形有两种方法:位图矢量。位图字体通过将像素直接绘制到确定大小的二维网格上,来描述字形形状,而矢量字体则使用线和曲线绘制指令来描述字形轮廓。换句话说,位图字体是为特定大小设计的,而矢量字体是为所有大小设计的。从位图字体渲染的字形的质量在放大时始终会下降,而从矢量字体渲染的字形的质量则不会。然而,由于有限的像素用于拟合曲线,因此矢量字体在低分辨率设备(例如计算机屏幕)中以较小的尺寸渲染时往往效果不佳。在这种情况下,位图字体可能更精确。

但是,字体技术已经解决了低分辨率下的质量问题。例如

  1. 提示,存储在字体中的额外指南信息,供光栅化器以保留正确字形形状的方式拟合曲线。
  2. 抗锯齿,光栅化器的功能,使用一些人类感知的错觉(例如使用灰度级和彩色子像素)来模拟不匹配的像素,从而产生“平滑曲线”的感觉。

这些可以提高小尺寸矢量字体的质量。此外,现代台式机对位图字体的需求正在逐渐减少。

字体格式

[edit | edit source]

目前,X 窗口系统 for GNU/Linux 桌面支持多种字体格式。

BDF 字体

[edit | edit source]

BDF(位图分布格式)是 X Consortium 的一种位图字体格式,用于以既可读又可机器读的形式交换字体。它的内容实际上是纯文本。

PCF 字体

[edit | edit source]

PCF(可移植编译格式)只是 BDF 格式的编译形式。它是二进制的,因此,只有机器可读。将 BDF 编译成 PCF 的实用程序是 bdftopcf。虽然 BDF 字体可以直接安装到 X 窗口系统中,但它们通常被编译以获得更好的性能。

Type 1 字体

[edit | edit source]

Type 1是由Adobe制定的矢量字体标准,并得到其Postscript标准的支持。因此,它在大多数UNIXGNU/Linux中得到了很好的支持,通过X 窗口系统Ghostscript。因此,它是传统UNIX打印的推荐格式。

TrueType 字体

[edit | edit source]

TrueType是由苹果开发的矢量字体标准,也用于Microsoft Windows。随着 Windows 的发展,它的普及程度也越来越高。XFree86在 FreeType 库的帮助下也支持 TrueType 字体。Ghostscript也支持 TrueType。因此,它成为GNU/Linux桌面字体的一种潜在选择。

OpenType 字体

[edit | edit source]

最近,AdobeMicrosoft同意创建一种新的字体标准,该标准涵盖 Type 1 和 TrueType 技术,并进行了一些增强以满足世界各地不同文字系统的需求。结果是OpenType

一个OpenType字体可以用Type 1TrueType样条线来描述字形轮廓。此外,还添加了用于将组合标记定位到基字符或其他标记的相对字形定位信息(即 GPOS 表),以及一些字形替换规则(即 GSUB 表),使其足够灵活,可以绘制各种语言的字符。

输出方法

[edit | edit source]

输出方法是在输出设备上绘制文本的过程。它将文本字符串转换为给定字体的正确定位的字形序列。对于简单的例子,如英语,字符到字形的映射可能是直观的。但对于其他文字系统,输出方法则更加复杂。有些可能是使用组合标记,有些以非从左到右的方向书写,有些使用单个字符的字形变体,有些需要重新排序字符,等等。

使用传统的字体技术,处理复杂文字系统的信息不会存储在字体中。因此,输出方法承受着负担。但对于OpenType字体,所有规则都存储在其中,输出方法只需要能够读取和应用这些规则。

输出方法在不同的实现中定义。对于 X 窗口,它被称为X 输出方法 (XOM)。对于GTK+,它使用一个名为Pango的单独模块。对于Qt,它通过一些类实现输出方法。现代渲染引擎现在能够使用OpenType字体。因此,在输出方法实现中绘制文本有两种方法。如果您使用的是TrueType或 Type 1 字体,并且您的文字系统在基于拉丁语的语言之上存在一些复杂性,您需要提供一种输出方法,该方法知道如何处理和排版您的文字系统的字符。否则,您可以使用包含描述字形替换和定位规则的 OpenType 表的 OpenType 字体。

输入方法

[编辑 | 编辑源代码]

输入方法的设计和实现涉及许多因素。字符集的大小和输入设备的功能差异越大,输入方法就越复杂。例如,使用 104 键键盘输入英文字符非常简单(大多是一对一 - 也就是说,一个按键产生一个字符),而使用手机键盘输入英文则需要更多步骤。对于字符集庞大的语言,例如中日韩,即使使用 PC 键盘,字符输入也非常复杂。

因此,分析和设计是输入方法创建的重要阶段。第一步是列出输入所需的全部字符(不是字形),包括数字和标点符号。下一步是决定是否可以将其与可用按键一一对应,还是需要一些组合(如欧洲重音符号)或转换(如中日韩罗马字输入)机制,其中需要多个按键才能输入某些字符。

当为文字决定了输入方案后,就可以设计键盘布局。好的键盘布局应该通过将最常用的字符放在主行,其余字符放在上行和下行来帮助用户。如果文字没有大小写概念(非拉丁文字几乎都是如此),则可以将罕见的字符放在 shift 位置。

然后,实现输入方法需要两个主要步骤。首先,创建一个键盘布局映射。这通常是一个简单的步骤,因为存在现有的键盘映射可供参考。然后,如果需要,第二步是根据键盘映射编写输入方法。一般来说,这意味着编写一个输入方法模块来插入系统框架。

区域设置

[编辑 | 编辑源代码]

区域设置是由国际化(I18N)的概念引入的,其中创建了通用框架,以便软件可以调整其行为以满足不同母语、文化规范和编码字符集的要求,而无需修改或重新编译。

在这些框架内,区域设置用于描述特定的文化。用户可以配置他们的系统来选择他们的区域设置。程序将加载相应的预定义区域设置定义来完成国际化功能。因此,要使国际化软件支持新语言或文化,必须创建一个区域设置定义并填写所需信息,这样就可以在不触碰软件代码的情况下完成操作。

根据POSIX[1] 一些 C 库函数,例如日期和时间格式、字符串排序、数值和货币格式,都依赖于区域设置。ISO/IEC 14652 在 POSIX 区域设置规范中添加了更多功能,并为纸张尺寸、测量单位、地址和电话格式以及人名定义了新的类别。 GNU C 库已经实现了所有这些类别。因此,可以通过它来描述文化规范。

区域设置定义在第 41-42 页进行了详细讨论。

翻译程序中的消息,包括菜单、对话框、按钮标签、错误消息等,可以确保不熟悉英语的本地用户可以使用该软件。这项任务只有在输入方法、输出方法和字体完成后才能完成 - 否则翻译后的消息将变得毫无用处。

有许多消息翻译框架可用,但基本概念相同。消息被提取到一个工作文件中以供翻译,并编译成一个哈希表。当程序执行时,它会根据区域设置加载相应的翻译数据。然后,快速查找消息以进行翻译,以便在用户界面中使用。

翻译是一项劳动密集型任务。翻译大量的消息需要时间,这就是为什么它总是由一组人完成的原因。在组建团队时,确保所有成员在程序的所有部分中使用一致的术语。因此,在论坛中通过密切讨论合作以及从集体做出的决定中构建词汇数据库至关重要。有时,翻译人员需要运行程序才能查看消息周围的上下文,以便找到适当的翻译。其他时候,翻译人员需要调查源代码以找到条件消息,例如错误消息。逐个字面翻译每条消息,不运行程序,往往会导致无法理解的输出。

与其他 FOSS 开发活动一样,翻译也是一项长期承诺。每个新版本通常都会引入新的消息。即使当前版本中的所有消息都已完成,也需要在下一个版本发布之前检查新消息。在版本发布之前,通常会有一个字符串冻结期,在此期间不允许在代码库中添加新的字符串,并为翻译人员分配适当的时间段。消息翻译过程的技术方面在第 45 页进行了讨论。

GNU/Linux 桌面结构

[编辑 | 编辑源代码]

在计划在GNU/Linux桌面中启用一种语言之前,需要清楚地了解其结构概述。GNU/Linux 桌面由相互叠加的子系统层组成。每一层都有自己的区域设置相关操作。因此,要完全启用一种语言,就需要在所有层面上进行操作。这些层,从下往上,依次为(参见图 1)

图 1 - GNU/Linux 桌面结构和国际化
C 库
C 是开发GNU/Linux应用程序的最低级别编程语言。其他语言依赖 C 库来调用操作系统内核
X 窗口
在大多数UNIX系统中,图形环境由X 窗口系统提供。这是一个客户端-服务器系统。X 服务器是提供服务以控制硬件设备(如显卡、显示器、键盘、鼠标或平板电脑)以及将用户输入事件从设备传递到客户端的代理。X 客户端是 GUI 应用程序,它们请求 X 服务器在屏幕上绘制图形对象,并通过 X 服务器提供的事件接受用户输入。请注意,使用这种架构,X 客户端和服务器可以在网络中的不同机器上。在这种情况下,X 服务器是用户操作的机器,而 X 客户端可以在同一台机器上运行,也可以在网络中的远程机器上运行。
工具包
使用低级 Xlib 编写程序既繁琐,而且当所有应用程序都根据自己的偏好绘制菜单和按钮时,会导致 GUI 不一致。一些库被开发为中间层,以帮助减少这两个问题。在 X 术语中,这些库被称为工具包。它们提供的 GUI 组件,例如按钮、文本输入等,被称为小部件。过去开发了许多历史悠久的工具包,要么由 X Consortium 本身开发,如 X Toolkit 和 Athena 小部件集(Xaw),要么由供应商开发,如来自 Sun 的 XView、来自 Open Group 的 Motif 等。在 FOSS 领域,最广泛采用的工具包是 GTK+ (The GIMP Toolkit)[2] 和 Qt.[3]
桌面环境
工具包帮助开发人员在一组程序中创建一致的外观和感觉。但是要创建一个完整的桌面,应用程序需要更紧密地协同工作,以形成一个方便的工作场所。桌面环境的概念是为了提供应用程序之间的通用约定、资源共享和通信而发明的。在 UNIX 平台上创建的第一个桌面环境是 Open Group 的 CDE (Common Desktop Environment),它基于其 Motif 工具包。但它是专有的。GNU/Linux 的第一个 FOSS 桌面环境是KDE (K Desktop Environment),[4] 基于 TrollTech 的 Qt 工具包。然而,由于当时 Qt 的一些许可条件,一些开发人员不喜欢它。因此,创建了第二个,称为 GNOME (GNU Network Object Modelling Environment),[5] 基于 GTK+。如今,尽管 Qt 的许可问题已得到解决,但 GNOME 仍在不断发展,并获得更多供应商和社区的支持。因此,KDE 和 GNOME 成为 GNU/Linux 和其他 FOSS 操作系统(如 FreeBSD)上使用最广泛的桌面。

每个组件都是国际化的,允许对不同的区域设置进行本地实现

GNU C 库
根据 POSIX 和 ISO/IEC 14652 进行国际化。
XFree86(以及一般的 X 窗口)
这一层面的国际化包括描述字体集和字符代码转换的 X 本地化 (XLC); 用于文本输入过程的 X 输入法 (XIM),其中 X 键盘扩展 (XKB) 用于描述键盘映射; 以及用于文本渲染的 X 输出法 (XOM)。 对于 XOM,它是在 GTK+ 和 Qt 已经通过各自的解决方案处理了渲染之后才实施的。 因此,XOM 是否仍然有必要值得怀疑。
GTK+
对于 GTK+ 2,国际化框架已以模块化方式定义。 它有自己的输入法框架,称为 GTK+ IM,其中输入法模块可以根据用户命令动态插入。 GTK+ 2 中的文本渲染由一个单独的通用文本布局引擎处理,称为 Pango。 Pango 可用于任何需要渲染多语言文本的应用程序,而不仅仅用于 GTK。
Qt
Qt 3 中的国际化以最小化方式完成。 它完全依赖于 XIM 进行所有文本输入,并使用 QComplexText C++ 类处理文本渲染,该类完全依赖于来自 Unicode.org 的 Unicode 数据进行字符属性。 对于桌面环境层,即 GNOME 和 KDE,除了 GTK+ 和 Qt 提供的之外,没有额外的国际化。
  1. POSIX 是可移植操作系统规范的缩写
  2. GTK+,‘GTK+ – The GIMP Toolkit’; 可从 https://gtk.org.cn 获取。
  3. 3 TrollTech,‘TrollTech – The Creator of Qt – The multi-platform C++ GUI/API’; 可从 http://www.trolltech.com 获取。
  4. KDE,‘KDE Homepage – Conquer your Desktop!’; 可从 http://www.kde.org 获取。
  5. GNOME,‘GNOME: The Free Software Desktop Project’; 可从 http://www.gnome.org 获取。
华夏公益教科书