R 需要您的帮助:翻译 R 消息



如果您使用 R,您可能想知道是否有办法为 R 的改进做出贡献。鼓励在世界各地使用 R 的一项重要功能是支持本地化。这使 R 的消息、警告和错误以及 Windows 和 Mac OS GUI 中的菜单标签能够以用户的本地语言显示。

本地化依赖于志愿者翻译团队贡献和维护的翻译。我们最近举办了一系列协作篝火,探讨了激励人们贡献翻译的动机、R 中翻译的当前状态以及人们如何参与其中。在这篇文章中,我们分享了这些会议的见解。

为什么要参与翻译?

帮助翻译 R 消息的一个显而易见的原因是,它使非英语使用者更容易使用 R,尤其是在英语工作知识不常见的社区中。如果您是软件包开发人员,了解翻译基础设施非常有用,因为相同的基础设施可用于向您自己的软件包添加翻译。事实上,其他开源项目也使用了相同的基础设施。为 R 项目贡献翻译是了解和更广泛地为 R 的开发做出贡献的一个良好起点。与任何开源贡献一样,当您与其他开发人员互动时,都会有构建您的知识和网络的优势。它也可以很好地添加到您的简历中!

R 中翻译的当前状态

R 消息的翻译存储在 PO 文件中,这是一种与 GNU gettext 软件配合使用的纯文本文件格式。基本 R 中每个软件包的源代码都有一个包含 PO 文件的po目录。每个软件包最多有三个 PO 文件:一个用于 R 代码中包含的消息,一个用于 C 代码中包含的消息,而对于基本软件包,一个用于 Windows GUI 中显示的文本。

因此,我们可以通过从基本 R 中的 14 个包中提取 PO 文件来探索 R 的当前状态(一些翻译团队还提供推荐包、Mac OS GUI 和 Windows 安装程序的翻译,我们在此不予考虑)。对于每条消息,我们可以确定特定语言是否提供翻译,如果提供,则确定翻译是否是最新的,或者消息是否已在翻译后发生更改,即翻译后的消息是“模糊”的。

Stacked bar chart of translation status in base and default packages (12 July 2022). Languages are ordered by number of correctly translated messages plus the number of fuzzy translations, out of a possible 5862. French: 5760 + 48; Italian: 5764 + 40; Russian: 5693 + 74; Lithuanian: 5677 + 86; German: 5371 + 226; Polish: 5370 + 226; Traditional Chinese: 5368 + 220; Japanese: 5005 + 361; Simplified Chinese: 4789 + 528; Korean: 4487 + 199; Brazilian Portuguese: 2835 + 1209; Norwegian Nynorsk: 1866 + 539; Turkish: 1846 + 532; Danish: 1778 + 471; Spanish: 1381 + 540; Persian: 266 + 9; British English: 11 + 18, English: 1 + 0.

我们可以看到,有少数语言的翻译接近完整且正确:法语、意大利语、俄语和立陶宛语。然后是一组覆盖率稍低且模糊消息比例较高的语言:德语、波兰语、中文(繁体)、日语、中文(简体)和韩语。第三组只有大约三分之一的消息被翻译:挪威语(新挪威语)、土耳其语、丹麦语和西班牙语。只有 GUI 消息被翻译成波斯语。标准英语消息已在基本包和 grDevices 包中的一些情况下被翻译成英式英语。最后,标准英语中有一条消息将有关语言环境的信息添加到 R 中的启动消息中。

PO 文件中的元数据包括英语消息上次更新的日期和翻译上次更新的日期。下图表示每个 PO 文件的上次翻译日期,以与上次消息更新之间的滞后时间(年)表示。

Scatterplot of lag in translation (years) for each PO file by language (12 July 2022). Languages are ordered by decreasing mean lag. French: mostly zero with a few lags of 1 or 2 years. Lithuanian: all zero (less than a year). Russian: mostly zero with spread from -1 to 2. Traditional Chinese and Korean: scatter spread from 0 to -3. Polish: only a couple of data points at -3. German: scatter spread from 0 to -10. Spanish: only a few data points: 0, -9, -9. Japanese: bulk of scatter from -5 to -8. Danish: scatter from -6 to -9. Persian: only a few data points at -9. Brazilian Portuguese: spread from -7 to 10. Norwegian Nyorsk and Turkish: main scatter at -10. Simplified Chinese: main scatter from -13 to -16. British English: -13, -16, -16. English: single PO file with lag of -13.

某些 PO 文件缺少上次翻译日期,特别是意大利语没有可用日期。但是,该图显示了与前一个图的明显对应关系 - 翻译覆盖率较高的语言在英语消息上次更新时已更新得更接近。覆盖率较低的语言在英语消息上次更新之前至少 5 年没有更新。对于中文(简体),大多数文件至少 10 年没有更新。

对于覆盖率较低的语言,我们可以探索翻译团队在确定要优先翻译哪些消息时做出的选择。下图比较了覆盖率较低语言的按包覆盖率

Translation status for low coverage languages (12 July 2022). Stacked bars show the number of correctly translated messages plus the number of fuzzy messages. 
base (2489 messages): Norwegian Nyorsk: 1764 + 519; Brazilian Portuguese: 1702 + 559; Spanish: 1285 + 515; Turkish: 1391 + 392; Danish: 1226 + 157. 
compiler (38 messages): Brazilian Portuguese and Danish: 29 + 3.
graphics (283 messages): Brazilian Portuguese: 217 + 45; Norwegian Nyorsk and Turkish: 102 + 20; Spanish: 96 + 25; Danish: 12 + 5.
grDevice (336 messages): Danish: 183 + 83; Brazilian Portuguese: 106 + 59.
grid (21 messages): Brazilian Portuguese: 44 + 133; Danish: 12 + 76. 
methods (436 messages): Brazilian Portuguese: 51 + 229; Danish: 26 + 28. 
parallel (59 messages): Danish: 32 + 13. 
splines (26 messages): Brazilian Portuguese and Danish: 16 + 5.
stats (1003 messages): Brazilian Portuguese: 603 + 142; Turkish: 341 + 116; Danish: 100 + 48. stats4 (8 messages): Brazilian Portuguese, Turkish and Danish: 3 + 1. 
tcltk (40 messages): Brazilian Portuguese and Danish: 37 + 1. 
tools (460 messages): Danish: 61 + 20; Brazilian Portuguese: 21 + 14; Turkish: 2 + 0. 
utils (472 messages): Danish: 41 + 31; Brazilian Portuguese: 5 + 18; Turkish: 7 + 3.

挪威语和西班牙语翻译仅适用于基本包和图形包。土耳其语翻译涵盖更多包,包括 stats 和 stats4 包中大约一半的消息。巴西葡萄牙语和丹麦语翻译适用于所有包(数据集包中没有要翻译的消息),但对于几个包,翻译消息的比例非常低(少于四分之一)。

您如何提供帮助?

显然,人们有很多机会为消息提供新翻译,或更新不再正确的翻译。第一步是详细了解如何将翻译添加到 R 包。我们建议从 useR! 2021 的将 R 翻译成您的语言教程开始 - 您可以观看视频和/或阅读幻灯片。

一旦您对该过程有了基本了解,请在翻译团队页面上找到您可以为其做出贡献的语言的联系人。如果您的语言不在其中,或者团队需要新的维护者,请在社区运营的R 贡献者 Slack的 #core-translations 频道或R-Devel邮件列表上发布消息提供帮助。

维护者或帮助渠道应该能够告诉你如何为特定语言做出贡献。一些翻译团队在 GitHub 上维护翻译,例如:意大利语法语。匈牙利团队正在试用一个Weblate服务器,该服务器允许通过浏览器提交翻译。参与翻译的几位贡献者活跃在 R 贡献者 Slack 的 #core-translations 频道,因此这是一个询问如何开始或在你开始做出贡献时遇到的任何问题的好地方。

更多资源

有许多正在进行的工作将在未来提供额外的支持

致谢

感谢协作篝火“探索 R 的本地化(翻译)流程”的参与者,他们为这篇博文提供了想法和草稿可视化:Shimelis Abebe TegegnIman Al HasaniMichael BlanksMichael ChiricoToby Dylan HockingPawan JangraElla KayePiyush KumarBeatriz MilzKozo NishidaLucy Njoki NjukiRiva QuirogaMarcel RamosBen Ubah