Mercurial/Python - 下划线函数的作用是什么?

6
在Mercurial中,许多扩展会将其帮助/语法字符串包装在下划线函数的调用中,如下所示:
 _('[OPTION] [QUEUE]')

这让我感到困惑,因为它似乎并不必要(编写扩展的说明没有提到它),而且在类中似乎没有定义_,所以我想知道这是一些我不理解的特殊语法,或者另一种说lambda的方式,或者可能是恒等函数?此外,我想知道这种方法(无论是什么)相比文档建议的原始字符串有什么好处。
我在Python文档中没有看到过这样的函数,所以我不确定这是一个Python问题还是Mercurial问题。
这里有两个使用这种结构的例子(请查看文件底部的cmdtable字典)。
2个回答

8
请查看第45行:
from mercurial.i18n import _

这是国际化包gettext和其他一些包中常用的缩写,用于将其参数翻译成当前程序所运行的语言。为方便起见,它被缩写为_,因为它几乎用于显示给用户的每条信息。
看起来Mercurial将其封装在自己的模块中。 ("i18n"代表"国际化",因为在"i"和"n"之间有18个字母。)

啊哈哈!好的,谢谢!所以这是为了方便,如果有人想要在他们自己的语言中运行它-但他们仍然需要提供/提交自己的翻译,对吧?如果我使用gettext,我不需要提供自己的翻译,对吧? - dimo414
@dimo414,使用标准库的gettext(以及GNU的其他语言),你肯定需要提供自己的翻译 - gettext的代码会获取并使用这些翻译过的短语,但它绝对不会在不同的自然语言之间进行自动机器翻译! - Alex Martelli
@Alex,抱歉我表达不清楚——问题是关于期望,而不是功能。从“提供一个完整的程序”角度来看,我应该自己创建这些翻译,还是发布没有翻译的代码被认为是可以接受的呢? - dimo414
@dimo414,发布没有翻译的代码是可以的,但为了让其他人编写和安装自己的翻译,您应该分发基本的.po文件,请参见http://www.gnu.org/software/gettext/manual/gettext.html#Installing-Localizations获取更多信息。 - Alex Martelli
1
所以这就是称之为“i18n”的原因。我一直在想这个问题,谢谢 :-) - Jochen Ritzel

7

_(一个单下划线的函数名)通常与国际化相关联,这是由于GNU方法 gettext 的先例,该方法也在Python标准库中找到了位置(相同的架构,完全不同的实现)-- 根据模块文档

gettext.install(domain[, localedir[, unicode[, codeset[, names]]]])

这将在Python的内置命名空间中安装函数_(),基于传递给函数translation()的domain、localedir和codeset。unicode标志被传递给生成的翻译对象的install()方法。
对于names参数,请参阅翻译对象的install()方法的描述。
如下所示,通常通过调用_()函数来标记应用程序中需要翻译的字符串,例如:
```python _("This string needs to be translated.") ```
print _('This string will be translated.') 

为了方便起见,您希望将_()函数安装在Python的内置命名空间中,以便在应用程序的所有模块中轻松访问。
正如@ptomato所提到的,Mercurial通过将其自己用于相同国际化目的的等效函数命名为_来遵循这一传统。
还有一个单独的传统是使用_作为“我不关心”的标识符,例如:
fee, fie, _, _, foo, _, fum = thesevenitemstuple

但是当然最好不要在同一段代码中同时使用这两种传统;-)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接