2012-02-28

Git中文本地化

Git从版本1.7.5(2011年4月)即开始国际化/本地化(i18n/l10n)的准备工作,到版本1.7.8正式完成了Git国际化/本地化框架和基础设施的工作。 参见 提交 5e9637c

针对部分语种的本地化工作已经开始,最早会在 Git 1.7.10 版本开始提供中文的本地化支持。

Git中文本地化注意事项

Git本地化(包括中文本地化)的协同方式不同于Git项目本身,不使用邮件列表进行提交评审,而是通过GitHub的协同工具来完成,这在Git邮件列表中有专门的讨论: Git官方邮件列表 。最终确定的工作流程参见Git源码中的文件 po/README

中文本地化工作流程

中文本地化的协同版本库为: https://github.com/gotgit/git-po-zh_CN/ ,以下简称 git-po-zh_CN 。 如果您对翻译有修改或补充,请参照如下工作流程。

  1. 使用 GitHub 的 Fork 功能从 git-po-zh_CN 派生项目。

  2. 从您个人派生的版本库克隆。如:

     git clone git@github.com:<your-account>/git-po-zh_CN.git
     cd git-po-zh_CN
    
  3. 修改 po/zh_CN.po 文件,补充和完善翻译内容,并提交。

     edit po/zh_CN.po
     ...
     git add -u
     git commit
    
  4. 将您的提交推送至GitHub(您的派生版本库)。

     git push
    
  5. 使用GitHub提供的 pull request 功能,创建到 git-po-zh_CN 版本库的 Pull Request。

  6. 版本库 git-po-zh_CN 的管理者审核您的 Pull Request。

  7. 若审核通过则将提交合并到代码树中,pull request 自动关闭。

  8. 若提交有问题,管理者会通过评论给出原因。作为贡献者继续执行步骤3、步骤4,当修改后的提交推送(或强制推送)到GitHub后,pull request 中的提交会自动更新。管理者基于贡献者的最新提交重新审核(即步骤6)。

工作协同

为了避免多人翻译过程中的工作重叠,使用 GitHub 维基帮助工作协同。即在翻译之前现在维基页面上领受工作任务,不同贡献者的工作任务不要重叠。

例如中文本地化工作任务管理WIKI: https://github.com/gotgit/git-po-zh_CN/wiki/TaskList 。

提交规范

本地化参与者在创建 Pull Request 前,请先确认提交是否遵守下列规范:

  • 只能修改 po/zh_CN.po 文件,或者在 po/TEAMS 文件中补充中文翻译团队成员列表。若对其他文件进行改动,会导致 pull request 被拒绝。

  • 提交说明符合 “50/72 原则”。

    • 提交说明第一行会作为补丁邮件的标题或者作为补丁文件的文件名,长度以50个字符为限。

      有人喜欢第一行提交说明的末尾添加一个“点”表示句子的结束,这是不可取的。试想你在写邮件是标题要以点来结束么?一个文件名(不含扩展名)如果以点结束,加上扩展名或出现两个点!

      还有要注意这部分内容不能包含中文,建议提交说明使用 l10n: 作为前缀,以便和Git其他代码的提交相区分。

    • 一个空行。此空行用以分隔标题和详细描述。

    • 关于提交的大段说明(可选)。例如原翻译存在的问题,为什么要进行修改等。

      提交说明可以折行,每行以72个字符为限。这部分提交说明可以包含少量中文。

  • 提交说明中包含签名,并且签名和提交说明间用空行分隔。

    可以通过命令 git commit -s 会自动在提交说明中添加签名。

作为Git的 l10n 协调者(l10n coordinator),我写了一个脚本以实现对本地化文件、提交规范的自动化检查。 l10n teamder 在向 l10n coordinator 创建 pull request 前,建议使用该脚本对提交进行体检。

  • 获取 po-helper.sh 脚本到本地工作区的 po 目录下。

      $ git fetch git://github.com/git-l10n/git-po.git po-helper
      来自 git://github.com/git-l10n/git-po
       * branch            po-helper  -> FETCH_HEAD
      $ git checkout FETCH_HEAD -- po/
    
  • 检查本地的新提交。

      $ po/po-helper.sh check commits
    
  • 检查最近的5次提交。

      $ po/po-helper.sh check commits HEAD~5
    
  • 检查本地化文件。

      $ po/po-helper.sh check commits zh_CN.po
    
  • l10n 协调者对本地化的全面检查。

      $ po/po-helper.sh check
    

翻译示例

  • C语言字符串中的参数(占位符)很重要,需要维持其顺序。

    注意字符串中出现的两个占位符 %d%s 的先后顺序要严格保持,或者采用后面的解决方案。

      #: builtin/apply.c:824
      #, c-format
      msgid "regexec returned %d for input: %s"
      msgstr "regexec 返回 %d,输入为:%s"
    
  • 如果确有需要,可以使用类似 %<n>$s 的语法对C语言字符串中的参数(占位符)进行标记,以便调整语序。

      #: builtin/apply.c:3266
      #, c-format
      msgid "new mode (%o) of %s does not match old mode (%o)%s%s"
      msgstr "%2$s 的新模式(%1$o)和旧模式(%3$o)%4$s%5$s 不匹配"
    
  • 然而,Shell语言字符串中的变量(占位符)的顺序则不重要,可以根据翻译需要调整先后次序。

      msgid "Clone of '$url' into submodule path '$path' failed"
      msgstr "无法克隆 '$url' 到子模组路径 '$path'"
    
  • 大多数情况下,英文标点翻译为中文标点。如:

      msgid ""
      "'%s' appears to be a git command, but we were not\n"
      "able to execute it. Maybe git-%s is broken?"
      msgstr ""
      "'%s' 像是一个 git 命令,但却无法运行。\n"
      "可能是 git-%s 受损?"
    
  • 但是有的字符串要由程序进行后处理,并且处理过程中需要依赖其中的标点符号,这种情况下标点符号不能翻译,要严格保持。如:

      #  译者:末尾两个字节可能被删减,如果翻译为中文标点会出现半个汉字
      #: wt-status.c:250
      msgid "modified content, "
      msgstr "修改的内容, "
    
  • 大多数情况下,要注意保持原文中句子前、后,以及句子中间的空白。大多是排版的需要。

      #  译者:注意保持前导空格
      #: diff.c:105
      #, c-format
      msgid "  Failed to parse dirstat cut-off percentage '%.*s'\n"
      msgstr "  无法解析 dirstat 阈值 '%.*s'\n"
    
      #  译者:为保证在输出中对齐,注意调整句中空格!
      #: wt-status.c:266
      #, c-format
      msgid "new file:   %s"
      msgstr "新文件:    %s"
    
      #  译者:为保证在输出中对齐,注意调整句中空格!
      #: wt-status.c:269
      #, c-format
      msgid "copied:     %s -> %s"
      msgstr "拷贝:      %s -> %s"
    
      #  译者:注意保持句尾空格
      #: wt-status.c:890
      msgid "Initial commit on "
      msgstr "初始提交于 "
    
  • 但有的情况下涉及到两个翻译为中文的字符串拼接,原文中句子前、后包括句中的空白需要在译文中删除。

      #  译者:汉字之间无空格,故删除尾部空格
      #. TRANSLATORS: This is "remote " in "remote branch '%s' not found"
      #: builtin/branch.c:163
      msgid "remote "
      msgstr "远程"
    
      #  译者:%s若翻为中文,前后不需要空格
      #: builtin/commit.c:783
      #, c-format
      msgid ""
      "\n"
      "It looks like you may be committing a %s.\n"
      "If this is not correct, please remove the file\n"
      "\t%s\n"
      "and try again.\n"
      msgstr ""
      "\n"
      "看起来您正在提交一个%s。\n"
      "如果不是这样,请删除文件\n"
      "\t%s\n"
      "然后重试。\n"
    
  • 大多数情况下,考虑到输出的美观,需要重新对译文字符串进行排版(重新设置换行符)。

      #: builtin/commit.c:42
      msgid ""
      "Your name and email address were configured automatically based\n"
      "on your username and hostname. Please check that they are accurate.\n"
      "You can suppress this message by setting them explicitly:\n"
      "\n"
      "    git config --global user.name \"Your Name\"\n"
      "    git config --global user.email you@example.com\n"
      "\n"
      "After doing this, you may fix the identity used for this commit with:\n"
      "\n"
      "    git commit --amend --reset-author\n"
      msgstr ""
      "您的姓名和邮件地址基于登录名和主机名进行了自动设置。请检查它们正确\n"
      "与否。您可以通过下面的命令对其进行明确地设置以免再出现本提示信息:\n"
      "\n"
      "    git config --global user.name \"Your Name\"\n"
      "    git config --global user.email you@example.com\n"
      "\n"
      "设置完毕后,您可以用下面的命令来修正本次提交所使用的用户身份:\n"
      "\n"
      "    git commit --amend --reset-author\n"
    
  • 但有时保持原有换行方式更好。

    下面的示例中如果译文将两行合并为同一行,会因为两处的 %s 被扩展造成输出太长。

      #  译者:保持原换行格式,在输出时 %s 的替代内容会让字符串变长
      #: builtin/branch.c:137
      #, c-format
      msgid ""
      "deleting branch '%s' that has been merged to\n"
      "         '%s', but not yet merged to HEAD."
      msgstr ""
      "将要删除的分支 '%s' 已经被合并到\n"
      "         '%s',但未合并到 HEAD。"
    

工具

  • VIM 和 po.vim

    安装 po.vim 插件后,使用 VIM 编辑 .po 文件,可以使用如下热键非常方便地进行本地化工作。

    • \u - 下一条未翻译条目
    • \U - 上一条未翻译条目
    • \f - 下一条fuzzy条目
    • \F - 上一条fuzzy条目
    • \c - 将 msgid 的字符串拷贝至 msgstr
    • \d - 删除 msgstr 字符串
    • \z - 将字串标记为 fuzzy
    • \Z - 移除字串标的 fuzzy 标记
    • \s - 显示统计信息
    • \W - 格式化文件

    下载地址: http://www.vim.org/scripts/script.php?script_id=2530

  • kbabel, loaklize

    Linux 平台有非常好用的图形界面工具辅助本地化,如 kbabel, lokalize 等工具可以方便地对 .po 文件进行编辑。

    不过我还是喜欢在文本工作模式(VIM + po.vim),尤其是切换到 Mac OS X 平台后无法用到 kbabel 和 lokalize。

术语表

已翻译内容中涉及到的术语的翻译做到了基本一致,若遇到不确认的术语请先在已翻译内容中查找,恕不一一列举。

为什么有的Git命令的输出还没有翻译?

如果遇到您需要的Git命令尚未翻译,往往不是因为中文本地化翻译未完成,而是因为相应命令的输出尚未进行国际化标识。 Git 的国际化(i18n)和本地化(l10n)刚刚开始,肯定存在很多命令输出被遗漏,没有使用相关语法进行标识,导致未能在本地化文件中出现。

例如我发现和解决的几处Git国际化遗漏的问题:

Git国际化不完整的问题不能采用本文介绍的中文本地化工作流程进行操作,而是按照修改Git源代码的工作流程进行工作。 具体参见 Documentation/SubmittingPatchest

blog comments powered by Disqus