2010-06-19 43 views
5

在水銀,許多擴展的包裹他們的幫助/語法字符串中調用下劃線的功能,比如:Mercurial/Python - 下劃線功能的作用是什麼?

_('[OPTION] [QUEUE]') 

這讓我困惑,因爲似乎有必要不(在Writing Extensions指令不提及它),並且似乎沒有在類中定義_,所以我想知道這是否是某種我不明白的特殊語法,也許是另一種說lambda的方法,或者也許是身份函數?此外,我想知道這種方法的好處(不管它是什麼)只是像文檔建議的原始字符串。

沒有我在Python文檔中看到的提到這樣一個函數,所以我不確定這是否真的是Python問題或Mercurial問題。

下面是使用這種結構的兩個例子(看接近該文件的底部cmdtable字典)

回答

8

外觀上線45:

from mercurial.i18n import _ 

這是通常的abb國際化軟件包gettext中的更新以及可能還有其他軟件包,用於將其參數的翻譯返回到該程序當前正在運行的語言的功能。爲了方便起見,它縮寫爲_,因爲它幾乎用於顯示用戶。

看起來像Mercurial將它包裝在自己的模塊中。 (「i18n」代表「國際化」,因爲「i」和「n」之間有18個字母。)

+0

Ahaha!好的謝謝!所以如果有人想用自己的語言來運行它,這是爲了方便 - 但他們仍然必須提供/提交自己的翻譯,對吧?如果我使用gettext,我不希望提供我自己的,對嗎? – dimo414 2010-06-19 21:20:03

+0

@ dimo414,帶有標準庫的gettext(以及用於其他語言的GNU自己的),您將無限期地提供自己的翻譯 - gettext的代碼的作用是獲取並使用這些翻譯過的短語,它最有把握**不會**在不同的自然語言之間進行自動機器翻譯! – 2010-06-19 21:23:26

+0

@Alex,對不起,我不清楚 - 問題是關於期望,而不是功能。從「提供一個完整的程序」的角度來看,我是否希望自己創建這些翻譯,或者是否認爲我沒有它們發佈代碼是正常的? – dimo414 2010-06-19 21:29:29

6

_(單個下劃線的函數名稱)通常與國際化相關, gettext,一個GNU的辦法,還發現在Python的標準庫的地方(相同的架構,完全不同的實現) - 每the module's docs

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

這將安裝功能_()在 Python的內置函數的命名空間的基礎上, domain,localedi r和代碼集,其中 被傳遞給函數 translation()。 unicode標誌是 傳遞給結果翻譯 對象的install()方法。

有關名稱參數,請參閱 翻譯的描述 object的install()方法。

如下所示,你通常標誌着在應用程序中的 字符串是 候選人翻譯,通過 在呼叫包裹他們的_() 功能,如:

print _('This string will be translated.') 

爲方便起見,你需要_()函數在Python的builtins命名空間中安裝 ,所以它很容易被 您的應用程序的所有模塊都可以訪問 。

作爲@ptomato提到,Mercurial遵循了這一傳統,命名爲_,它們自身的等效功能用於相同的國際化目的。

還有一個單獨的傳統使用_爲「我不在乎」標識,如

fee, fie, _, _, foo, _, fum = thesevenitemstuple 

但當然,你最好不要在同一個同時使用傳統的一次代碼;-)

+1

你的意思是「Python的標準庫」,對吧? – tonfa 2010-06-19 22:32:06

+0

@tonfa,是的 - 修理,謝謝。 – 2010-06-19 23:28:25

+0

+1用於解釋.install()的內部工作原理 – BlackVegetable 2013-08-01 23:12:23