使用Django的模版來(lái)配合字符串翻譯工作
Django模板使用兩種模板標(biāo)簽,且語(yǔ)法格式與Python代碼有些許不同。 為了使得模板訪問(wèn)到標(biāo)簽,需要將 {% load i18n %} 放在模板最前面。
這個(gè){% trans %}模板標(biāo)記翻譯一個(gè)常量字符串 (括以單或雙引號(hào)) 或 可變內(nèi)容:
<title>{% trans "This is the title." %}</title>
<title>{% trans myvar %}</title>
如果有noop 選項(xiàng),變量查詢還是有效但翻譯會(huì)跳過(guò)。 當(dāng)空缺內(nèi)容要求將來(lái)再翻譯時(shí),這很有用。
<title>{% trans "myvar" noop %}</title>
在一個(gè)帶 {% trans %} 的字符串中,混進(jìn)一個(gè)模板變量是不可能的。如果你的譯文要求字符串帶有變量(占位符placeholders),請(qǐng)使用 {% blocktrans %} :
{% blocktrans %}This string will have {{ value }} inside.{% endblocktrans %}
使用模板過(guò)濾器來(lái)翻譯一個(gè)模板表達(dá)式,需要在翻譯的這段文本中將表達(dá)式綁定到一個(gè)本地變量中:
{% blocktrans with value|filter as myvar %}
This will have {{ myvar }} inside.
{% endblocktrans %}
如果需要在 blocktrans 標(biāo)簽內(nèi)綁定多個(gè)表達(dá)式,可以用 and 來(lái)分隔:
{% blocktrans with book|title as book_t and author|title as author_t %}
This is {{ book_t }} by {{ author_t }}
{% endblocktrans %}
為了表示單復(fù)數(shù)相關(guān)的內(nèi)容,需要在 {% blocktrans %} 和 {% endblocktrans %} 之間使用 {% plural %} 標(biāo)簽來(lái)指定單復(fù)數(shù)形式,例如:
{% blocktrans count list|length as counter %}
There is only one {{ name }} object.
{% plural %}
There are {{ counter }} {{ name }} objects.
{% endblocktrans %}
其內(nèi)在機(jī)制是,所有的塊和內(nèi)嵌翻譯調(diào)用相應(yīng)的 gettext 或 ngettext 。
每一個(gè)RequestContext可以訪問(wèn)三個(gè)指定翻譯變量:
- {{ LANGUAGES }} 是一系列元組組成的列表,每個(gè)元組的第一個(gè)元素是語(yǔ)言代碼,第二個(gè)元素是用該語(yǔ)言表示的語(yǔ)言名稱。
- 作為一二字符串,LANGUAGE_CODE是當(dāng)前用戶的優(yōu)先語(yǔ)言。 例如: en-us。(請(qǐng)參見下面的Django如何發(fā)現(xiàn)語(yǔ)言偏好)
- LANGUAGE_BIDI就是當(dāng)前地域的說(shuō)明。 如果為真(True),它就是從右向左書寫的語(yǔ)言,例如: 希伯來(lái)語(yǔ),阿拉伯語(yǔ)。 如果為假(False),它就是從左到右書寫的語(yǔ)言,如: 英語(yǔ),法語(yǔ),德語(yǔ)等。
如果你不用這個(gè)RequestContext擴(kuò)展,你可以用3個(gè)標(biāo)記到那些值:
{% get_current_language as LANGUAGE_CODE %}
{% get_available_languages as LANGUAGES %}
{% get_current_language_bidi as LANGUAGE_BIDI %}
這些標(biāo)記亦要求一個(gè) {% load i18n %} 。
翻譯的hook在任何接受常量字符串的模板塊標(biāo)簽內(nèi)也是可以使用的。 此時(shí),使用 _() 表達(dá)式來(lái)指定翻譯字符串,例如:
{% some_special_tag _("Page not found") value|yesno:_("yes,no") %}
在這種情況下,標(biāo)記和過(guò)濾器兩個(gè)都會(huì)看到已經(jīng)翻譯的字符串,所有它們并不需要提防翻譯操作。
備注:
在這個(gè)例子中,翻譯結(jié)構(gòu)將放過(guò)字符串"yes,no",而不是單獨(dú)的字符串"yes"和"no"。翻譯的字符串將需要包括逗號(hào)以便過(guò)濾器解析代碼明白如何分割參數(shù)。 例如, 一個(gè)德語(yǔ)翻譯器可能會(huì)翻譯字符串 "yes,no" 為 "ja,nein" (保持逗號(hào)原封不動(dòng))。
相關(guān)文章
python實(shí)現(xiàn)拉普拉斯特征圖降維示例
今天小編就為大家分享一篇python實(shí)現(xiàn)拉普拉斯特征圖降維示例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-11-11
在Python的Tornado框架中實(shí)現(xiàn)簡(jiǎn)單的在線代理的教程
這篇文章主要介紹了在Python的Tornado框架中實(shí)現(xiàn)簡(jiǎn)單的在線代理的教程,代理功能是一個(gè)常見的網(wǎng)絡(luò)編程實(shí)現(xiàn),需要的朋友可以參考下2015-05-05
Flask的url_for和request.url如何進(jìn)行URL判斷
這篇文章主要介紹了Flask的url_for和request.url如何進(jìn)行URL判斷問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-07-07
python使用requests.post方法傳遞form-data類型的Excel數(shù)據(jù)的示例代碼
這篇文章介紹了python使用requests.post方法傳遞form-data類型的Excel數(shù)據(jù)的示例代碼,某些post接口,需要發(fā)送multipart/form-data類型的數(shù)據(jù),如何使用python requests來(lái)模擬這種類型的請(qǐng)求發(fā)送呢?補(bǔ)充講解了python使用requests post請(qǐng)求發(fā)送form-data類型數(shù)據(jù),一起看看吧2024-01-01
淺談Python使用pickle模塊序列化數(shù)據(jù)優(yōu)化代碼的方法
這篇文章主要介紹了淺談Python使用pickle模塊序列化數(shù)據(jù)優(yōu)化代碼的方法,pickle模塊可以對(duì)多種Python對(duì)象進(jìn)行序列化和反序列化,序列化稱為pickling,反序列化稱為unpickling,需要的朋友可以參考下2023-07-07
python獲取外網(wǎng)IP并發(fā)郵件的實(shí)現(xiàn)方法
下面小編就為大家?guī)?lái)一篇python獲取外網(wǎng)IP并發(fā)郵件的實(shí)現(xiàn)方法。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-10-10
Django rest framework基本介紹與代碼示例
這篇文章主要介紹了Django rest framework基本介紹與代碼示例,簡(jiǎn)單敘述了rest framework的一些用處,可選擇的相關(guān)軟件包,然后分享了一個(gè)簡(jiǎn)單的模型支持的API的例子,小編覺得還是挺不錯(cuò)的,具有一定借鑒價(jià)值,需要的朋友可以參考下2018-01-01

