引言
通常,本地化(本文件中指界面翻译)要在一个应用中启用,需要由开发人员与语言专家协作完成。开发人员使用软件厂商(此处为 Microsoft Visual Studio)提供的一系列工具,从代码中提取字符串(文本)数据库。随后,开发人员对该数据库进行处理,标明哪些字符串可以修改以供翻译、哪些是静态的、哪些则绝不应翻译。处理后的数据库会被转换为一个简单文件(例如 Excel 或 .csv),其中包含(通常是)英文版字符串,并发送给语言专家翻译为目标语言。该文件随后连同译文一起发回开发团队,由团队进一步将其处理为“资源文件”,并随应用程序安装包一同包含在内。此后还需要做进一步的工作,才能让用户选择在应用中显示的语言。
许多商业应用正是以这种方式实现本地化的,当应用很少变更、且开发团队资源充足足以管理本地化流程时,这种做法效果很好。但 N1MM+ 的情况并非如此。
为了找到一种无需大规模开发投入就能把翻译功能扩展到多语言的业余无线电社区的办法,我们开发了一种混合式方案:它为用户带来若干使用上的便利,并通过自助方式把支持负担从开发团队身上卸下,让 N1MM+ 用户既能分担翻译工作,也能共享彼此的劳动成果。总体上,我们力求遵循帕累托原则,让用户以 20% 的工作量获得完全本地化应用 80% 的收益。
本文件包含两个主要部分。
- 对整个流程如何运作的总体说明
- 面向 N1MM 用户的文档
工作原理
请注意,为便于非软件开发人员理解,下文做了大幅简化。
N1MM+ 由窗体与代码组成。窗体很容易辨认,它们几乎就是用户与之交互的任何窗口,例如录入窗口(Entry Window)、配置窗口(Configuration Window)和频谱显示(Spectrum Display)。N1MM Logger+ 中约有 48 个窗体。每个窗体都包含若干供用户操作的控件。以录入窗口(N1MM Logger+ 的主窗体)为例,其中有用于输入 QSO 信息的文本框、用于启动宏和其他操作的按钮、供用户在应用中导航的菜单,以及向用户显示提示文字的状态栏(status bar)。
在代码中,通过执行相应操作来实现应用的各项功能。与本地化流程相关的主要是两类指令:一类向用户显示提示、警告或错误消息(即消息框),另一类更新窗体上显示的文本来表示状态变化或操作进度,例如状态栏中显示的内容。
控件通常包含一组属性,用于决定该对象如何显示给用户。例如,按钮有一个“text”属性,其中包含显示在按钮上的文字,让用户知道它的作用。菜单也有类似属性,用于告知用户选择某个菜单项时将执行什么功能或打开哪个窗体。另一个常见属性是“工具提示(tool tip)”。当鼠标光标悬停在支持工具提示、且程序员已提供此类信息的控件上时,会弹出这类气泡来显示帮助信息。
同样,窗体背后的代码中也有一组字符串(文本),会在代码执行过程中按特定条件显示给用户。
为便于翻译,上述各种字符串中有许多都保存在一张数据库表中,该表标明了窗体、控件、属性以及要显示的字符串。窗体打开和重绘时,会对选定窗体执行一个函数(后文详述),从该数据库表中取出译文来替换默认英文(前提是存在对应译文);若没有,则显示默认英文。应用所显示的语言由配置窗口“其他(Other)”选项卡上的“语言(Language)”控件设置决定。
N1MM Logger+ 应用内提供了一套工具包,可通过“配置(Config)”菜单访问。该工具执行多项与维护包含已翻译文本元素的数据库表相关的功能。要让窗体中的控件和消息可被翻译,其基本流程包括以下步骤:
- 在数据库中创建一条基线英文“占位项”,用于标识控件或字符串,并提取与相应属性关联的英文文本。
- 将所选窗体的基线英文数据库条目导出为 Excel 或 .CSV 文件。
- 用户在现有条目右侧新增一列,并将文本字段翻译为目标语言。
- 完成后,用户将文件重新导入 N1MM Logger+,并指明译文所用的语言。
- 打开已翻译的窗体时,若当前选定的语言在数据库表中有对应的翻译行,这些译文字符串将替换对应的英文。
请注意,文本字符串的编码为 UTF-8。它应当能处理所有拉丁字符变体以及日语等表意字符集和其他亚洲字符集。从右向左书写的语言(如希伯来语、阿拉伯语)字符似乎可用,但截至本文撰写时,尚不清楚在 N1MM Logger+ 中无需额外编程是否能正确渲染。这需要由真正懂这些语言的人来测试。
希望了解如何让 N1MM+ 窗体支持翻译的程序员,可参阅附录面向开发人员的翻译技术信息(Translation Technical Information for Developers)。
用户文档
安装语言
在录入窗口的“工具(Tools)”菜单中,选择“下载并安装语言包(Download and Install Language Pack (Internet))”选项。将显示以下对话框:

这里会列出 N1MM Logger+ 网站上可用的各项翻译。单击某一行将启用“加载语言包(Load Pack)”按钮。该按钮会下载相应的 XML 文件并将其安装到您计算机上的 N1MM Logger+ 中。
选择语言
要为 N1MM Logger+ 启用特定语言,请依次打开 配置(Config)…Configure Ports, Mode Control, Audio, Other…。在“其他”选项卡上,从语言组合框(Language Combo Box)中选择所需语言。请注意,可选语言只有已加载到您的翻译数据库表中的那些。在您运行翻译工具(见下文)之前,英语也可能缺失,但英语功能并不需要它。默认设置为英语。

添加新的翻译
一般说明: 翻译工具包支持导出和导入 Excel 与 .CSV 两种格式的文件。作者认为 Excel 是更好的格式,因为 Excel 应用功能强大,且发生崩溃时还能恢复文件。当然,并非所有人都能使用 Excel,因此他们必须使用 .CSV 格式。此处不对工具的选择作任何推荐。Google 搜索显示,网上有许多免费版本可用。
无论如何,都不要用 Excel 来创建 .CSV 文件。否则您将麻烦不断:Excel 的默认设置不允许把 UTF-8 字符导出为 .CSV 格式,您还有损坏译文的风险。
在 配置(Config)…管理翻译(Manage Translations)… 中打开该对话框。将出现管理翻译界面。单击“翻译表维护(Translation Table Maint.)”选项卡。其外观应如下所示:

列表框中将显示 N1MM Logger+ 应用中的所有窗体。请注意,有少数窗体未被开发人员启用翻译,但它们相对不太重要。选择您要翻译的窗体,然后按“创建英文(Create English)”按钮。这会将所选窗体中所有可翻译的字符串填入数据库表。工具执行完毕后,将显示以下消息:

在“翻译工具(Translation Tools)”区域,从语言选择器(Language Picker)组合框中选择“English”。然后根据需要单击“全部导出(Export All)”或“导出未翻译项(Export Untranslated)”。“全部导出”允许您导出翻译表中选定窗体的所有英文行。如果是全新配置一种语言,您应从这一步开始。
“导出未翻译项”只会导出表中尚无所选语言译文的那些英文条目。例如,当您要为更新后窗体上的新控件添加译文,或想补充一组尚未完成的翻译时,可以使用此功能。
请注意,在语言选择器中选择英语以外的语言时,工具将导出该语言的条目。请注意,这对于修改已有的译文集合很有用,也可作为翻译方言或其他相似语言的起点。
单击任一按钮都会显示标准的文件打开对话框。所创建文件的类型由使用的文件扩展名决定:可以是 .csv(逗号分隔值文件),也可以是 .xlsx(Excel 电子表格)。本文件的示例将使用 Excel。完成后将显示以下消息:

“翻译工具”区域的其余部分将在后文说明。
用合适的工具打开您创建的文件。下面是使用 Excel 打开“配置器(Configurer)”窗体的示例。

切勿修改 A-I 列中的任何条目!!!!在 Excel 中,这些列默认通过将宽度设为零而隐藏。请加宽 J 列和 K 列,使文件外观与下图类似:

在“K”列中为“J”列的文字添加译文。此示例为波兰语。请注意以下规则:
- 不要删除任何行,即使文本为空。如果该控件是一个容器、没有可翻译的文本,其条目仍然是确定父控件与子控件层级关系所必需的。
- 如果您不想翻译某段文本(比如某个缩写的译法与英文相同),请把文本从 J 列复制到 K 列。
完成后,文件外观如下:

重要说明:如果您只翻译某个窗体的一部分,请务必删除电子表格中英文列非空、但译文列为空的所有行。否则,这些窗体中未翻译的元素将显示为空白,而不是有效的文本元素。
单击“导入翻译(Import Translation)”选项卡。将显示以下内容:

单击“…”按钮,浏览到您在上一步创建的文件,或在文本框中输入路径和文件名。
在“导入操作(Import Action)”下,选择“添加未翻译项(Add Untranslated)”,仅添加输入文件中在目标语言的翻译表里尚不存在的行。如果您希望在导入前删除所选窗体的所有译文,请选择“全部替换(Replace All)”。这将会启用下方当前处于禁用状态的控件。
选择您翻译成的目标语言。
将翻译列设置为包含您译文的那一列(此例中为“K”)。
如果您删除了第一行,请取消选中“首行包含列标题(First row contains column headers)”复选框。
注意:导入文件中的 B 列包含正在翻译的控件所属的窗体名称。导入文件时,将使用该列的值来判断控件属于哪个窗体,以及在选择了“全部替换”时应删除哪些译文(如果有)。对于每个新窗体,系统都会询问您是否确定要删除现有译文。
下面显示上述设置的结果:

准备好后单击“导入(Import)”按钮。完成后将显示一条消息:

现在转到录入窗口,选择 配置(Config)…Configure Ports, Mode Control, Audio, Other…。在“其他”选项卡上,从语言组合框中选中您刚刚翻译成的语言。以波兰语为例,在配置界面中单击“确定”后,录入窗口应出现以下变化:

共享译文与使用他人的翻译成果
要与他人共享您的翻译成果,请单击“翻译表维护”选项卡并选择您希望与他人共享的窗体。在语言选择器中选中您已完成翻译的语言。单击“导出分发文件(Export for Distribution)”按钮。
这将打开标准的文件打开对话框,让您为导出文件选择位置和名称。请注意,该文件仅为 XML 格式。单击“确定”,文件即创建完成。
该文件的使用者无需使用上文描述的任何功能,即可为分发文件中保存的窗体和语言启用译文。使用“…”按钮选择要导入的文件,然后单击“导入”按钮。接着转到 Configure Ports…Other 选项卡,选中刚刚导入的语言。导入文件中已翻译的窗口随后将以该语言显示。
下图展示用户导入的过程:

请注意,可能只有翻译团队成员才需要使用此功能。一般用户应使用前文所述的“下载并安装语言包”这一全自动功能。
清空翻译表(Empty Translation Table)
清空翻译表的功能名副其实:它会清除翻译表中的所有条目,包括译文和英文。如果您没有把翻译成果另存为 Excel 或 .csv 文件,请不要使用该功能。
Google Translate
此功能最初是为了帮助开发人员创建测试译文而加入的。对译者来说,它作为入门工具未必有用。选择所需的窗体,然后从“行为(Behavior)”下拉框中选择全部刷新(Refresh All)或添加未翻译项(Add Untranslated)。“全部刷新”将删除所选窗体和语言的所有现有译文,而“添加未翻译项”只会用 Google 翻译那些尚未翻译的英文文本元素。
关于此功能的一些说明:
- 该功能不受支持。
- 它使用了 Google Translate 网站中未公开的功能,从而无需在客户端计算机上安装任何额外的 Google 软件。
- 因此,它有大约 500 条翻译的配额,超出后用户会被暂时拒绝访问;大约一小时之后访问会恢复。如果在收到该错误后仍使用“添加未翻译项”行为,它会从出错处重新开始。
- 翻译会在待译文本元素中的第一个句点处终止。因此,包含多个句子的文本元素只会翻译第一句。
诊断(Diagnostics)选项卡
诊断选项卡用于检查翻译表的完整性。它会显示应用中不存在或已不再存在的 GUI 对象的译文,以及尚未翻译成所选语言的英文对象。请注意,其检查范围由“翻译表维护”选项卡上选定的窗体决定。此功能主要面向开发人员,但访问它不会有任何危害。它不使用任何现有的英文占位项进行比较,而是对所选窗体执行一次全新的完整扫描,并以扫描结果作为比较基准。
编辑翻译(Edit Translations)
编辑翻译选项卡以网格控件显示翻译数据库,供用户对文本进行有限的编辑。首次单击该选项卡时,网格控件中将显示整个数据库。有三种筛选器可用于把显示范围限定到特定的语言、窗体和控件。漏斗图标分别用于应用和移除筛选器。该窗体如下图示:

唯一可以单击并编辑的列是标为“文本(Text)”的列,并且只允许编辑非英文行。如果您尝试编辑其他行,将会收到错误消息,文本也会恢复到编辑前的状态。此功能的目的是对少数控件译文做细微调整,而无需执行完整的导出与导入流程。
单击“移除筛选(Remove Filter)”按钮也会刷新屏幕。