CLI 程序部分标点符号用法建议

68 views
Skip to first unread message

Wenbin Lv

unread,
Dec 24, 2021, 10:09:34 AM12/24/21
to i18n-zh
本建议来源于本人近期的翻译工作,并参考了身边一些人的意见。希望大家讨论。如果没有什么问题的话,今后我如果有时间大规模翻修现有 CLI 程序的翻译的话,就按此统一格式了。

【冒号】
冒号左边的分句如果完全由英文和数字组成,则使用英文冒号,冒号后如有空格应该保留。如果冒号左边的分句含有中文字符,则使用中文冒号。

举例和理由:
“-bash: foo: 未找到命令”
冒号离左边的字符比较近,并且中文冒号一般比英文冒号高。如果用中文冒号的话不太美观,感觉和右边的中文是一个整体,和左边的英文脱离。一般冒号都是和左边的字符串一起打印的("%s:"),跟随左边字符串的语言也比较合理。更别说目前的情况是一个英文一个中文(-bash: foo:未找到命令)。

“无法打开设备文件 /dev/sda:权限不够”
因为左边是一个中文句子,虽然冒号前面是英文字符,但还是使用中文冒号。

“test.c:1:10: 致命错误:foo.h: 没有那个文件或目录”
如果在 10 的后面用中文冒号的话就不太和谐了,因为前面两个冒号是分隔符,后面也没有空格,是不宜替换为中文冒号的,于是就会出现“test.c:1:10:”这种情况。

【引号】
最外层的引号不论原文如何,均使用 ASCII 双引号“"”。内层按照中文规则交替使用 ASCII 单引号和双引号。引号外侧如有空格应该保留(和中文标点之间没有空格)。

理由:
英文等宽字体基本上都自带引号。由于英文圆引号和中文引号是同一编码,字体选择英文等宽字体时,就算让翻译者改变打字习惯,在引号外侧加空格,也难以模拟中文引号的效果(比如内部是中文时引号高度太矮,或者引号形状像两撇而看起来明显是英文引号)。字体选择中文等宽字体时(特指 Noto Sans Mono CJK,文泉驿除外),则会因为字体内引号占两格而终端认为占一格而引起显示问题。所以最简单的方法就是使用 ASCII 引号。
根据 GNU style[1],没有说明单引号和双引号在使用条件上有什么区别,所以原文使用单引号应当是英语也可在最外层使用单引号所引起,所以除非原文中双引号和单引号的引用明显有不同的含义,可以保留原文,否则都应替换成双引号。使用“`'”这种方式已经不再被 GNU 推荐,所以同理。例外:原文如果在引用双引号,比如 missing `"',显然译文用 """ 有可读性问题,可以保留原文或者用 '"'。

【括号】
括号内只有英文或数字时,使用英文括号,括号外侧如有空格应当保留(和中文标点之间没有空格)。括号内含有中文时,使用中文括号。

理由:
除非使用英文宽度严格是中文一半的等宽字体(如 Noto Sans Mono Extracondensed、Inconsolata、Ubuntu Mono、Iosevka),否则都是中文宽度小于英文两倍,终端中每个中文字符的右侧会有一些空白。如果在英文外侧用中文括号,效果就会类似于( foo),在中文外侧用英文括号,效果类似于 (你 好 ),也就是括号内字符到两侧括号的距离不相同。

[1] https://www.gnu.org/prep/standards/html_node/Quote-Characters.html

Regards,
Wenbin Lv

Dz Chen

unread,
Dec 25, 2021, 12:41:07 AM12/25/21
to i18n-zh
使用英文还是中文(半角/全角)的标点符号,更直接的原因是看这个标点符号是用在哪个语境下。这是所有中西文混排的原则。你所列举的例子是一些表现而非原因,倒推用法会出错。

比如括号,在中文里,它的作用是对主句的补充说明,这个括号放到中文句子里就要用全角的,而不是看括号里面的内容。一些命令中也会包含括号,这时的括号要跟随命令使用英文的半角形式。

同理适用于冒号,你要看这个冒号是哪个语境下的使用,比如这句“-bash: foo: 未找到命令”,第一个冒号处于命令(英文)这个子语境中中,使用半角;而第二个冒号服务于整句,整句面向中文用户的,应该使用全角形式。

关于引号,一些终端模拟器有个兼容性选项,用以设定不明宽度字符的显示宽度,设置为宽字符可以解决部分问题。

Wenbin Lv

unread,
Dec 25, 2021, 10:54:41 AM12/25/21
to i18n-zh
我知道按照出版物的标准[1][2],标点符号的选择是看上下文的语境。但是无论是微软的指南[3]还是本组自己写的《工作指南》[4],对于标点的建议都不是完全按照语境(以下称为“语义正确”)来的。微软看起来几乎是完全根据美观或实用角度来选择。比如问号和叹号用半角(可能为了节省空间),引号跟随引号内的文字的语言(可能是为了美观)。《工作指南》为了美观也规定 CLI 的括号一律用半角。这个大概就是理论和工程的差别。微软的软件是要卖钱的,所以美观的权重基本就是 100%。Linux 用户虽然更偏技术一些,但是应该还是在意外观的人比在意语义正确的人更多。我这么说的原因是因为,我在朋友群里提出标点选择问题的时候,所有人都表示他们在看到文本的时候第一感觉是这个标点是否美观,而不是它是否符合语义。他们都是程序员,但都不是桌面 Linux 用户,大概也能代表普通用户的看法。

所以关于选择标点时考虑的因素,我暂时认为美观优先于语义。再看各个标点:

【括号】
这个符号按照语义应该跟随括号外侧的文本的语言。但是目前的《工作指南》对 CLI 程序是按照美观的。问题是就算按照美观,也不应该只用英文括号。大部分发行版使用默认字体的话,中文字符右侧都会有段空白,Ubuntu 这种用 Ubuntu Mono 的除外。“括号内文字两侧的空白不一样宽”明显比“中文字体的全角括号不好看”要更严重。再说现在的中文字体也很难说中文括号不好看了。

【冒号】
不管你是否认同“美观优先于语义”这一观点,我认为“foo: 未找到命令”这种句子中的冒号所在的语境就是比较模糊的,理解成中文语境或者英文语境都有一定的道理。

比如“-bash: foo: 未找到命令”这句,你的理解是“(-bash: foo): (未找到命令)”这种,但是我觉得这种前面有一连串冒号的句子是在打印调用栈(很多程序的诊断输出都是这样的),也就是类似于“(-bash: (foo: (未找到命令)))”,调用栈的每一环都是等价的,自然要用一样的冒号。

再说最简单的“foo: 未找到命令”,理解成中文环境的理由就是中文 Linux 中,输出一个带中文的行,默认就是一个中文句子,最外层就用中文标点。但是这句话也可以理解为“foo 说:‘未找到命令’”,“未找到命令”是“说”的内容,它是个子句,在正式文章中应当要用引号包围的,它自己形成了一个子环境,它的语言不应该影响到整个句子的语言。所以只看冒号左边,它在形式上是一个只有英文的句子,就因为它在中文 Linux 中出现,就认为它是中文句子,似乎有点牵强。

或者也可以理解为 CLI 最外层是一个英文环境,毕竟提示符是英文,很多程序是英文,中文程序也有很多字符串没翻译,没翻译默认语言就是英文,而且翻译完了源字符串一变就 fuzzy。比如说使用中文冒号,然后其中有一行 fuzzy 了:

open:权限不够
open: No such file or directory
open:打开的文件描述符过多

这种输出给人的感觉就是翻译的是“冒号+后面的句子”,但是更直观的想法是翻译的只有后面的句子而已。翻译工作只是在一个英文环境中把其中的一些子句替换为中文而已。按照这种理解的话,似乎所有这类冒号都要用英文冒号。但是像 gcc 里,“warning: ”是一个 msgid,后面有可能是英文也可能是中文,两边都是中文的话用英文冒号又太奇怪。

如果认可语境有歧义的话,还不如纯粹按照美观来,按美观的结果我觉得就应该和冒号左边的语言一致,这点我觉得我的审美应该还是比较主流的吧……话说出版物的标准也没有对这种例子作出规定,如果有规定的话就比较有参考意义,按理有可能出现这种情况的,比如可能会有书本中某一段写着:

Alice: 你好!
Bob: 你好!

这种。

【引号】
引号按照语义也应该跟随引号外侧的文本的语言,不过基本上没法在终端中见到真正的中文引号,所以为了照顾把终端字体改成中文等宽字体的用户(应该不少,至少我以前不知道有 fallback 机制时都是这样设置的,那时候主流还是文泉驿,所以不会出问题),也为了译者写 po 文件时不用在中文引号的外侧加空格(来模拟间距),就推荐用 " " 了,这个和目前的《工作指南》也是一致的。

至于“不明宽度字符的显示宽度”这个设置项,我确实是第一次听说,看了下 xfce-terminal 里面有这个设置,不过使用英文字体时改这个设置并不能把英文引号显示成中文宽度,还会导致输入的引号删不掉……然后我 xfce-terminal 里不知为何找不到 Noto Sans Mono CJK SC,也找不到文泉驿,所以测试不了在中文等宽字体下的效果了,不过应当不会影响引号的使用建议,毕竟不是默认设置,而且很多终端都没有这个设置。


Regards,
Wenbin Lv
Reply all
Reply to author
Forward
0 new messages