翻译

简介#

SUMO 使用 gettext 工具 来维护翻译字符串列表。主要的翻译工作由社区通过 Weblate 完成。 Weblate 上的每一次更改都会在其 SUMO 仓库的克隆中创建一个提交,该提交在经过审查后将被合并(目前是手动的,见下文)到主线中。Weblate 仓库会通过 Eclipse 在主仓库安装的 webhook 自动更新。

因此,如果您想添加翻译字符串,请在 Weblate 上开设一个账户并开始。

标记可翻译字符串#

在代码中,所有需要翻译的字符串都应使用 TL 宏进行标记,例如:TL("String to be translated")。出于可读性考虑,我们决定不使用常用的 _ 宏。

该宏在 src/utils/common/MsgHandler.h 中定义,需要包含该文件(但通常已经包含)。如果您有使用 + 拼接的字符串,应使用 TLF 宏进行替换,例如 TLF("The vehicle '%' has a message.", id)WRITE_MESSAGE 宏的格式化版本之一。 因此,不要使用 WRITE_MESSAGE("The vehicle '" + id "' has a problem."); 而应使用 WRITE_MESSAGEF(TL("The vehicle '%' has a problem."), id);(这也适用于 WRITE_WARNINGWRITE_ERROR)。

请注意,更改代码中的可翻译字符串(即使只是修复拼写错误)将使所有翻译失效(即移除)。这并不意味着您不应该这样做,您只需同时审查对翻译文件的更改。如果您想保留翻译但修复可翻译字符串中的拼写错误,请考虑使用我们的辅助脚本来完成此任务。

翻译不应应用于调试和开发者消息。这包括 src/foreign、src/libsumo、src/libtraci、src/traci_testclient 和 unittest 中的所有内容。

上下文#

同一个字符串在不同的上下文中可能有不同的含义,或者由于 GUI 中的空间有限而需要更短的版本。为此,可以使用 TLC 宏,其中可以提及上下文:它首先包含上下文,然后是字符串作为参数,如 TLC("Simulation", "Stop")。 以下是当前使用的上下文标识符列表:

  • Simulation
  • Labels

使用翻译#

默认情况下启用翻译。所需的 gettext 工具和国际化库可能已经安装在 Linux 上。如果未安装,请在您的系统上使用相当于 sudo apt install gettext 的命令。最好也执行 sudo apt install locales-all 以确保系统上安装了所有需要的区域设置。 对于 Windows,我们已将所有内容包含在 SUMOLibraries 中。

翻译字符串按语言分为三个文件,位于 $SUMO_HOME/data/po,一个用于 GUI,一个用于命令行应用程序,一个用于 python 工具。虽然可以直接编辑这些文件,但不建议这样做,以避免与 Weblate 的翻译发生合并冲突。这些文件仍需要编译才能使用。目前这是通过调用 tools/build_config/i18n.py 手动完成的。该脚本还会扫描 src 目录并检查新的可翻译字符串。如果发现新字符串,所有现有的 po 文件都将相应更新。

测试翻译#

所有 SUMO 二进制文件都理解 --language 选项,其行为与环境变量 LANGUAGE 完全相同,如 gettext 文档 中所述。 因此,要测试土耳其语,请设置 --language tr。请注意,默认情况下激活的是 C 区域设置,这会抑制所有翻译。如果您希望二进制文件尊重环境变量 LANGUAGE,可以使用 --language=(将 --language 设置为空字符串)。

新语言#

如果您想添加新语言,可以提交 issue 提出请求,或者运行 tools/build_config/i18n.py -l <lang> 并使用生成的 po 文件发起拉取请求。

开发者#

来自 Weblate 的翻译字符串不会自动推送到我们的 github 仓库,因为自动推送通常不是一个好主意,而且 weblate 没有权限。如果您想将 weblate 中的提交合并到主 github 中,您必须在本地的 SUMO git 克隆中执行以下操作:

git pull  # 确保您是最新的并且在目标分支上(通常是 main)
git remote add weblate https://hosted.weblate.org/git/eclipse-sumo/sumo-gui-netedit/  # 添加 Weblate 仓库(仅需一次)
git fetch weblate  # 获取新提交
git merge weblate/main

然后您应该审查更改并执行 git push

更改原始字符串#

直接在源代码中更改可翻译字符串将使翻译失效,因为原始字符串用作 .po 翻译文件中的键。默认情况下,过时的翻译将保留在 .po 文件中,但不会出现在 Weblate 中。如果原始字符串的含义没有改变,最好使用 python 脚本 tools/build_config/updateMessageIDs.py(参见 updateMessageIDs.py 帮助)。 脚本 tools/build_config/obsoleteTranslations.py(参见 obsoleteTranslations.py 帮助)可用于打印过时的翻译,并可选择将其从 .po 文件中完全移除。