[您也可以查看此文档的 单页版本。]

本地化 (l10n)

翻译已分为两个领域。首先是翻译发送给连接客户端的服务器消息。这个问题已经 暂时搁置。其次是翻译客户端及其库。

本地化概述

gettext 包提供翻译消息的服务。它使用 xgettext 工具从源代码中提取字符串以供翻译。这通过提取 _()、N_() 和 Q_() 宏的参数来实现。_() 用于允许函数调用的上下文中(通常除了静态初始化器之外的所有内容)。N_() 用于 _() 不适用的任何地方。用 N_() 标记的字符串需要在代码中引用时传递给 gettext 翻译例程。例如,请查看 subversion/svn/help-cmd.c 中如何处理页眉和页脚。Q_() 用于具有单数和复数形式的消息。

除了 _()、N_() 和 Q_() 宏之外,还使用 U_() 来标记不会被翻译的字符串,因为通常翻译内部错误消息没有用。这应该只影响大多数用户永远不会看到的模糊错误消息(由 Subversion 中的错误或非常特殊的存储库损坏引起)。使用 U_() 的原因是明确指出 gettext 调用并非遗漏。

当使用对 gettext 例程(*gettext 或 *dgettext)的直接调用时,请记住,大多数 Subversion 代码是库代码。因此,默认域不一定是 Subversion 自己的域。在库代码中,您应该使用 gettext 函数的 dgettext 版本。域名称在 PACKAGE_NAME 定义中定义。

所有用于本地化的必要设置都由 svn_private_config.h(对于 *nix)和 svn_private_config.hw(对于 Windows)中的 ENABLE_NLS 条件控制。请确保将

   #include "svn_private_config.h"

作为任何需要本地化的文件的最后一个包含文件。

还要注意,_()、Q_() 和 *gettext() 调用的返回值是 UTF-8 编码的;这意味着它们应该被翻译成当前正在写入的任何形式的程序输出的当前区域设置。

GNU gettext 手册 (https://www.gnu.org/software/gettext/manual/html_node/gettext_toc.html) 在其“准备程序源代码”部分提供了有关编写可翻译程序的更多信息。它的提示主要适用于字符串组合。

当前可用的翻译可以在 存储库的 po 部分 中找到。如果您想开始尚未提供的翻译,请联系 [email protected]。翻译讨论将在该列表中进行。

软件版本要求

Makefile 构建目标 locale-gnu-*(用于维护 po 文件)需要 GNU gettext 0.13 或更高版本。请注意,这不是那些想要将 *.po 文件编译成 *.mo 的人的要求。

开始新的翻译

在开始新的翻译之前,请与 subversion 开发邮件列表联系,以确保您没有重复工作。另外请注意,该项目强烈偏好由多人维护的翻译:向列表发送您的意图邮件可能有助于您找到支持者。

之后,您应该执行以下步骤

Unix (GNU gettext)

  1. 签出 Subversion(有关更多信息,请参阅 INSTALL)
  2. 运行 ./autogen.sh
  3. 运行 ./configure
  4. 运行 make locale-gnu-pot
    此步骤目前仅支持基于 GNU gettext Makefile 的系统
  5. 在工作副本的 subversion/po 目录中运行 msginit --locale LOCALE -o LOCALE.po。LOCALE 是用于标识您的区域设置的 ll[_LL] 语言和国家/地区代码。

步骤 (2) 和 (3) 生成 Makefile;步骤 (4) 生成 subversion/po/subversion.pot

Subversion 项目有一个策略,不将其文件中的名称,因此请应用以下两个更改。

新生成的 .po 文件中的标题如下所示

  # SOME DESCRIPTIVE TITLE.
  # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
  # This file is distributed under the same license as the PACKAGE package.
  # FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.

请将该块替换为以下文本

  # <Your language> translation for subversion package
  #    Licensed to the Apache Software Foundation (ASF) under one
  #    or more contributor license agreements.  See the NOTICE file
  #    distributed with this work for additional information
  #    regarding copyright ownership.  The ASF licenses this file
  #    to you under the Apache License, Version 2.0 (the
  #    "License"); you may not use this file except in compliance
  #    with the License.  You may obtain a copy of the License at
  #
  #      http://www.apache.org/licenses/LICENSE-2.0
  #
  #    Unless required by applicable law or agreed to in writing,
  #    software distributed under the License is distributed on an
  #    "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
  #    KIND, either express or implied.  See the License for the
  #    specific language governing permissions and limitations
  #    under the License.

.po 文件中的第一个翻译块包含两行,如下所示

  "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
  "Language-Team: LANGUAGE <[email protected]>\n"

请将它们替换为这两行

  "Last-Translator: Subversion Developers <[email protected]>\n"
  "Language-Team: YOUR LANGUAGE <[email protected]>\n"

Unix(非 GNU gettext)

待记录

Windows

请参阅问题 #1977

验证您的 po 文件

在提交到邮件列表或提交到存储库之前,请确保您的 po 文件“编译”。您可以通过以下步骤(在基于 Makefile 的系统上)执行此操作

  1. 运行 ./autogen.sh
  2. 运行 ./configure(使用适当的参数)
  3. 运行 make locale

autogen.sh 步骤很重要,因为它将新的 po 文件添加为“locale”构建目标的依赖项。但是请注意,步骤 1 和 2 仅在您添加新翻译后才需要执行一次。

提交您的 po 文件

请不要将大型 po 文件发送到邮件列表。[email protected] 上有许多订阅者使用的是慢速连接,他们不希望通过电子邮件收到大型文件。相反,请将 po 文件放置在互联网上的某个位置供下载,并仅发布 URL。如果您没有可用的网站,请在 dev@ 上询问,有人会帮助您找到一个位置。

当然,如果您有 Subversion 存储库的提交权限,您可以直接将 po 文件提交到那里,假设所有其他要求都已满足。

更新现有 po 文件

基于 Makefile 的构建系统包含一个 make 目标,以方便维护现有 po 文件。要在具有 GNU gettext 的系统上更新 po 文件,请运行

    make locale-gnu-po-update

要仅更新特定语言,您可以使用

    make locale-gnu-po-update PO=ll

其中 ll 是 po 文件的名称,不带扩展名(即 PO=sv)。

建议使用两次提交来完成 .po 更新;一次在“make locale-gnu-po-update”之后,一次在翻译完成之后。这有两个优点

  • gettext(1) 会产生大量的行号更改,这使得生成的 diff 难以被其他翻译人员审查。通过两次提交,所有行号更改都存储在第一次提交中,第二次提交包含所有实际翻译,没有额外的垃圾。
  • 如果特定语言有多个翻译人员(这在项目中是高度优先的),您不会冒着工作数小时只是为了发现其他翻译人员在您完成时已经完成了工作的风险。当您尝试执行第一次提交时,您会立即注意到其他人正在处理 .po 文件,因为 svn 会告诉您该文件已过期。

分支维护

在 trunk 中编辑 po 文件非常简单,但当这些更改要转移到发布分支时,就会变得更加复杂。项目策略是在发布分支上不进行任何直接更改,提交到分支的所有内容都应从 trunk 合并。这也适用于 po 文件。使用 svn merge 来完成这项工作会导致冲突和模糊消息,因为 gettext 会更改行号和字符串格式。

以下方案消除了使用 svn merge 进行分支更新时存在的任何复杂性。以下规则适用
  • 翻译更新到 trunk
  • 分支上需要的消息曾经存在于 trunk 上,从 trunk 合并
  • 在分支上的 po 文件上允许 2 个批量操作
    • make locale-gnu-po-update
    • 合并来自主干的消息(见下文)
  • 剩余的几条消息,在任何修订版中从未存在于主干上,已在分支上翻译
  • 消息选项(如模糊)可以调整

以上列表是分支上所有允许对 po 文件执行的操作的完整枚举。

可以使用以下命令将主干修订版 X 的 YY.po 中的消息合并到您的分支工作副本中

  svn cat -r X ^/subversion/trunk/subversion/po/YY.po | \
    po-merge.py YY.po

po 和 mo 文件的要求

在某些 gettext 实现中,我们必须确保 mo 文件(无论是通过项目获得还是本地创建)都使用 UTF-8 编码。此要求源于 Subversion 在内部使用 UTF-8,某些实现会翻译到活动区域设置,以及 bind_textdomain_codeset() 在不同实现之间不可移植的事实。

为了满足此要求,po 文件必须使用 UTF-8 编码。如果目标系统上的 gettext 实现不支持 bind_textdomain_codeset(),则构建系统将通过从 po 文件头中删除 Content-Type 头来确保 mo 文件为 UTF-8。请注意,某些 msgfmt 实用程序不喜欢缺少字符集指示符,并且会生成类似于“将无法进行字符集转换”的警告。您可以安全地忽略这些警告。

空字符串 msgid 部分的约定

某些 gettext 实现使用 msgid ""(空字符串)的部分来保存管理数据。建议的标题之一是“Last-Translator:”字段。由于 Subversion 项目的策略是不在特定文件中命名贡献者,而是在存储库日志消息中给予认可,因此您需要不要将您的姓名放在此字段中。

由于某些工具需要此字段才能将 po 文件视为有效(例如 Emacs PO 模式),因此您可以在此字段中输入“[email protected]”。

翻译团队

翻译项目 试图组织翻译尝试并为各种软件包获取翻译人员。一些团队有指导方针来促进跨软件包的一致性。

单引号与双引号

该项目已标准化引号的使用。一些翻译团队也做了同样的事情。如果您的语言环境没有翻译团队,或者他们没有标准化引号,请遵循本指南其他地方的项目指南。如果他们有:请遵循它们 :-)

错误消息约定

由于翻译人员通常会在代码中看到所有错误消息,因此重要的是要知道本文件中有一个关于此类字符串的 特别部分。这里与引号相同:对于翻译团队没有为您的语言制定明确策略的所有方面,请遵守它们。

TortoiseSVN 官方中文版 1.14.7 发布