i18n 擴(kuò)展

2018-02-24 15:39 更新

Import name:?jinja2.ext.i18n

Jinja2 當(dāng)前只附帶一個(gè)擴(kuò)展,就是 i18n 擴(kuò)展。它可以與?gettext?或?babel?聯(lián)合使用。如果啟用了 i18n 擴(kuò)展, Jinja2 提供了?trans?語句來標(biāo)記被其包裹的 字符串為可翻譯的,并調(diào)用?gettext?。

在啟用虛擬的?_?函數(shù)后,之后的?gettext?調(diào)用會(huì)被添加到環(huán)境的全局變量。那么 一個(gè)國(guó)際化的應(yīng)用應(yīng)該不僅在全局,以及在每次渲染中在命名空間中提供至少一個(gè)?gettext?或可選的ngettext?函數(shù)。

環(huán)境方法

在啟用這個(gè)擴(kuò)展后,環(huán)境提供下面的額外方法:

jinja2.Environment.install_gettext_translations(translations,?newstyle=False)

在該環(huán)境中全局安裝翻譯。提供的翻譯對(duì)象要至少實(shí)現(xiàn)?uggettext?和?ungettext?。gettext.NullTranslations?和?gettext.GNUTranslations?類和?Babel‘s 的?Translations?類也被支持。

Changed in version 2.5:?添加了新樣式的 gettext

jinja2.Environment.install_null_translations(newstyle=False)

安裝虛擬的 gettext 函數(shù)。這在你想使應(yīng)用為國(guó)際化做準(zhǔn)備但還不想實(shí)現(xiàn)完整的 國(guó)際化系統(tǒng)時(shí)很有用。

Changed in version 2.5:?添加了新樣式的 gettext

jinja2.Environment.install_gettext_callables(gettext,?ngettext,newstyle=False)

在環(huán)境中把給出的?gettext?和?ngettext?可調(diào)用量安裝為全局變量。它們 應(yīng)該表現(xiàn)得幾乎與標(biāo)準(zhǔn)庫(kù)中的?gettext.ugettext()?和?gettext.ungettext()?函數(shù)相同。

如果激活了?新樣式?,可調(diào)用量被包裝為新樣式的可調(diào)用量一樣工作。更多 信息見?新樣式 Gettext?。

New in version 2.5.

jinja2.Environment.uninstall_gettext_translations()

再次卸載翻譯。

jinja2.Environment.extract_translations(source)

從給定的模板或源中提取本地化字符串。

對(duì)找到的每一個(gè)字符串,這個(gè)函數(shù)生產(chǎn)一個(gè)?(lineno,?function,?message?)?元組,在這里:

  • lineno?是這個(gè)字符串所在行的行號(hào)。
  • function?是?gettext?函數(shù)使用的名稱(如果字符串是從內(nèi)嵌的 Python 代碼中抽取的)。
  • message?是字符串本身(一個(gè)?unicode?對(duì)象,在函數(shù)有多個(gè)字符串參數(shù) 時(shí)是一個(gè)unicode?對(duì)象的元組)。

如果安裝了?Babel?,?Babel 集成?可以用來為 babel 抽取字符串。

對(duì)于一個(gè)對(duì)多種語言可用而對(duì)所有用戶給出同一種的語言的 web 應(yīng)用(例如一個(gè)法國(guó)社 區(qū)安全了一個(gè)多種語言的論壇軟件)可能會(huì)一次性加載翻譯并且在環(huán)境生成時(shí)把翻譯方 法添加到環(huán)境上:

translations = get_gettext_translations()
env = Environment(extensions=['jinja2.ext.i18n'])
env.install_gettext_translations(translations)

get_get_translations?函數(shù)會(huì)返回當(dāng)前配置的翻譯器。(比如使用?gettext.find?)

模板設(shè)計(jì)者的?i18n?擴(kuò)展使用在?模板文檔?中有描述。

新樣式 Gettext

New in version 2.5.

從版本 2.5 開始你可以使用新樣式的 gettext 調(diào)用。這些的啟發(fā)源于 trac 的內(nèi)部 gettext 函數(shù)并且完全被 babel 抽取工具支持。如果你不使用 Babel 的抽取工具, 它可能不會(huì)像其它抽取工具預(yù)期的那樣工作。

標(biāo)準(zhǔn) gettext 調(diào)用和新樣式的 gettext 調(diào)用有什么區(qū)別?通常,它們要輸入的東西 更少,出錯(cuò)率更低。并且如果在自動(dòng)轉(zhuǎn)義環(huán)境中使用它們,它們也能更好地支持自動(dòng) 轉(zhuǎn)義。這里是一些新老樣式調(diào)用的差異:

標(biāo)準(zhǔn) gettext:

{{ gettext('Hello World!') }}
{{ gettext('Hello %(name)s!')|format(name='World') }}
{{ ngettext('%(num)d apple', '%(num)d apples', apples|count)|format(
    num=apples|count
)}}

新樣式看起來是這樣:

{{ gettext('Hello World!') }}
{{ gettext('Hello %(name)s!', name='World') }}
{{ ngettext('%(num)d apple', '%(num)d apples', apples|count) }}

新樣式 gettext 的優(yōu)勢(shì)是你需要輸入的更少,并且命名占位符是強(qiáng)制的。后者看起 來似乎是缺陷,但解決了當(dāng)翻譯者不能切換兩個(gè)占位符的位置時(shí)經(jīng)常勉勵(lì)的一大堆 麻煩。使用新樣式的 gettext ,所有的格式化字符串看起來都一樣。

除此之外,在新樣式 gettext 中,如果沒有使用占位符,字符串格式化也會(huì)被使用, 這使得所有的字符串表現(xiàn)一致。最后,不僅是新樣式的 gettext 調(diào)用可以妥善地為 解決了許多轉(zhuǎn)義相關(guān)問題的自動(dòng)轉(zhuǎn)義標(biāo)記字符串,許多模板也在使用自動(dòng)轉(zhuǎn)義時(shí)體驗(yàn) 了多次。

以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)