模板匹配翻譯 模板和UI?
日期:2023-03-11 12:39:36 / 人氣: 434 / 發(fā)布者:成都翻譯公司
模板和UI配置模板如果你不同的處理函數(shù)有不同的模板路徑).模板語(yǔ)法Tornado模板被直接轉(zhuǎn)換為Python.包含在你模板中的表達(dá)式會(huì)逐字的復(fù)制到一個(gè)代表你模板的Python函數(shù)中.翻譯函數(shù)有兩種形式:是可以根據(jù)第三個(gè)參數(shù)的值來(lái)翻譯字符串單復(fù)數(shù)的.一個(gè)模板文件本身可以作為一個(gè)模塊.模板和用戶界面
Tornado 包含一種簡(jiǎn)單、快速且靈活的模板語(yǔ)言。本節(jié)介紹語(yǔ)言和相關(guān)問(wèn)題,例如國(guó)際化。
Tornado 也可以使用其他 Python 模板語(yǔ)言,盡管沒(méi)有計(jì)劃將這些系統(tǒng)集成到其中。相反,它只是將模板轉(zhuǎn)換為字符串并將其傳遞給
配置模板
默認(rèn)情況下,Tornado 將在與當(dāng)前 .py 文件相同的目錄中查找關(guān)聯(lián)的模板文件。如果要將模板文件放在不同的目錄中,可以使用 template_path (如果不同的處理函數(shù)具有不同的模板路徑,則可以覆蓋)。
為了從非文件系統(tǒng)位置加載模板,請(qǐng)實(shí)例化子類并在應(yīng)用程序設(shè)置中為其配置 template_loader。
默認(rèn)情況下,編譯后的模板會(huì)被緩存;為了關(guān)閉此緩存并使更改(對(duì)目標(biāo))在重新加載后始終可見(jiàn),請(qǐng)?jiān)趹?yīng)用程序設(shè)置中使用compiled_template_cache=False 或debug=True。
模板語(yǔ)法
Tornado 模板只是將 Python 控制序列和表達(dá)式嵌入 HTML(或任何其他文本格式)文件中,并帶有一些標(biāo)記:
<html> <head> <title>{{ title }}title> head> <body> <ul> {% for item in items %} <li>{{ escape(item) }}li> {% end %} ul> body> html>
如果將此目標(biāo)另存為“template.html”并將其放在與 Python 文件相同的目錄中,則可以使用以下代碼呈現(xiàn)它:
class MainHandler(tornado.web.RequestHandler): def get(self): items = ["Item 1", "Item 2", "Item 3"] self.render("template.html", title="My title", items=items)
Tornado 模板支持控制語(yǔ)句和表達(dá)式??刂普Z(yǔ)句包含在 {% 和 %} 中,例如 {% if len(items)> 2 %}。表達(dá)式被包裹在 {{ 和 }} 之間,例如,{{ items[0] }}。
控制語(yǔ)句或多或少類似于 Python 語(yǔ)句。我們支持 if、for、while 和 try,它們必須使用 {% end %} 來(lái)標(biāo)記結(jié)束。我們也支持使用extends和block標(biāo)簽的模板繼承Statement,這些內(nèi)容的細(xì)節(jié)可以看。
表達(dá)式可以是任何 Python 表達(dá)式,包括函數(shù)調(diào)用。模板代碼將在包含以下對(duì)象和函數(shù)的命名空間中執(zhí)行(注意,此列表適用于模板的使用和渲染。如果直接在外部使用該模塊,則下面的許多不存在)。
當(dāng)您構(gòu)建一個(gè)真正的應(yīng)用程序時(shí),您可能希望使用 Tornado 模板的所有功能,尤其是目標(biāo)繼承。在 部分閱讀所有關(guān)于這些特性的信息(一些特性,包括 UIModules 是在模塊中實(shí)現(xiàn)的)
在引擎下,Tornado 模板直接轉(zhuǎn)換為 Python。模板中包含的表達(dá)式將被逐字復(fù)制到表示模板的 Python 函數(shù)中。我們不會(huì)試圖阻止模板語(yǔ)言中的任何內(nèi)容;我們很清楚創(chuàng)建一個(gè)高度靈活的模板系統(tǒng),而??不是一個(gè)嚴(yán)格限制的模板系統(tǒng)。因此,如果隨意在模板表達(dá)式中填充(代碼),執(zhí)行時(shí)也會(huì)出現(xiàn)各種隨機(jī)錯(cuò)誤。
默認(rèn)情況下,所有模板輸出都將使用函數(shù)轉(zhuǎn)義??梢酝ㄟ^(guò)將 autoescape=None 傳遞給或構(gòu)造函數(shù)來(lái)全局更改此行為。對(duì)于模板文件,您可以使用 {% autoescape None %} 指令,對(duì)于單個(gè)表達(dá)式,您可以使用 {% raw ...%} 而不是 {{ ... }}。此外,每個(gè)地方都可以使用可選的轉(zhuǎn)義函數(shù)名稱代替 None 。
請(qǐng)注意,雖然 Tornado 的自動(dòng)轉(zhuǎn)義有助于防止 XSS 漏洞,但它并不適用于所有情況。出現(xiàn)在特定位置的表達(dá)式,例如 Javascript 或 CSS,可能需要額外的轉(zhuǎn)義。此外,您必須小心始終在可能包含不受信任內(nèi)容的 HTML 中使用雙引號(hào),或者您必須在屬性中使用單獨(dú)的轉(zhuǎn)義函數(shù)(參見(jiàn)例如)
全球化
當(dāng)前用戶的語(yǔ)言環(huán)境(無(wú)論他們是否登錄)始終可以通過(guò)在請(qǐng)求處理程序中使用 self.locale 或在模板中使用語(yǔ)言環(huán)境來(lái)訪問(wèn)。語(yǔ)言環(huán)境的名稱(例如,en_US)可以通過(guò)locale.name 獲得,也可以通過(guò)方法翻譯字符串。該模板還有一個(gè)名為 _() 的全局函數(shù),用于字符串翻譯。翻譯函數(shù)有兩種形式:
_("Translate this string")
它是根據(jù)當(dāng)前的區(qū)域設(shè)置直接翻譯的,并且:
_("A person liked this", "%(num)d people liked this", len(people)) % {"num": len(people)}
可以根據(jù)第三個(gè)參數(shù)的值翻譯字符串單數(shù)和復(fù)數(shù)。在上面的例子中,如果 len(people) 為 1,則返回第一句的翻譯,否則返回第二句的翻譯。
*常見(jiàn)的翻譯模式四使用 Python 來(lái)命名占位符變量(上例中的 %(num)d),因?yàn)檎嘉环诜g過(guò)程中可能會(huì)發(fā)生變化。
這是一個(gè)正確的國(guó)際化模板:
<html> <head> <title>FriendFeed - {{ _("Sign in") }}title> head> <body> <form action="{{ request.path }}" method="post"> <div>{{ _("Username") }} <input type="text" name="username"/>div> <div>{{ _("Password") }} <input type="password" name="password"/>div> <div><input type="submit" value="{{ _("Sign in") }}"/>div> {% module xsrf_form_html() %} form> body> html>
默認(rèn)情況下,我們使用用戶瀏覽器發(fā)送的 Accept-Language 標(biāo)頭來(lái)發(fā)現(xiàn)用戶的語(yǔ)言環(huán)境。如果我們沒(méi)有找到合適的 Accept-Language 值,我們將使用 en_US。如果您讓用戶設(shè)置他們的首選語(yǔ)言環(huán)境,您可以通過(guò)覆蓋來(lái)覆蓋默認(rèn)選定區(qū)域:
class BaseHandler(tornado.web.RequestHandler): def get_current_user(self): user_id = self.get_secure_cookie("user") if not user_id: return None return self.backend.get_user_by_id(user_id) def get_user_locale(self): if "locale" not in self.current_user.prefs: # Use the Accept-Language header return None return self.current_user.prefs["locale"]
如果 get_user_locale 返回 None,那么我們(繼續(xù))依靠 Accept-Language 標(biāo)頭(做出判斷)。
該模塊支持兩種形式的加載翻譯:一種是帶有相關(guān)工具的.mo格式,另一種是簡(jiǎn)單的.csv格式。應(yīng)用程序通常在啟動(dòng)時(shí)調(diào)用一次或其中之一;檢查這些方法以獲取有關(guān)支持格式的更多詳細(xì)信息..
您可以使用您的應(yīng)用程序支持的區(qū)域(設(shè)置)列表。通過(guò)從支持的區(qū)域中選擇*接近的匹配來(lái)獲得用戶的區(qū)域。例如,如果用戶所在的區(qū)域是 es_GT,并且支持 es 區(qū)域模板匹配翻譯,則請(qǐng)求中的 self.locale 將設(shè)置為 es。如果未找到*接近的匹配項(xiàng),我們將使用 en_US。
用戶界面模塊
Tornado 支持 UI 模塊模板匹配翻譯,以便在您的應(yīng)用程序中輕松支持標(biāo)準(zhǔn)和重用 UI 組件。UI 模塊就像在頁(yè)面上渲染組件的特殊函數(shù)調(diào)用,它們可以包裝自己的 CSS 和 JavaScript。
例如,如果您實(shí)現(xiàn)了一個(gè)博客,并且您希望一個(gè)博客條目出現(xiàn)在主頁(yè)和每個(gè)博客頁(yè)面上,您可以實(shí)現(xiàn)一個(gè) Entry 模塊來(lái)在這些頁(yè)面上呈現(xiàn)它們。首先,為您的 UI 模塊創(chuàng)建一個(gè) Python 模塊,例如 uimodules.py:
class Entry(tornado.web.UIModule): def render(self, entry, show_comments=False): return self.render_string( "module-entry.html", entry=entry, show_comments=show_comments)
在您的應(yīng)用程序設(shè)置中,使用 ui_modules 配置告訴 Tornado 使用 uimodules.py
from . import uimodules class HomeHandler(tornado.web.RequestHandler): def get(self): entries = self.db.query("SELECT * FROM entries ORDER BY date DESC") self.render("home.html", entries=entries) class EntryHandler(tornado.web.RequestHandler): def get(self, entry_id): entry = self.db.get("SELECT * FROM entries WHERE id = %s", entry_id) if not entry: raise tornado.web.HTTPError(404) self.render("entry.html", entry=entry) settings = { "ui_modules": uimodules, } application = tornado.web.Application([ (r"/", HomeHandler), (r"/entry/([0-9]+)", EntryHandler), ], **settings)
在模板中,您可以使用 {% module %} 語(yǔ)法調(diào)用模塊。例如,您可以從 home.html 調(diào)用 Entry 模塊:
{% for entry in entries %} {% module Entry(entry) %} {% end %}
和 entry.html:
{% module Entry(entry, show_comments=True) %}
模塊可以包含自定義 CSS 和 JavaScript 函數(shù),方法是覆蓋 embedding_css、embedded_javascript、javascript_files 或 css_files 方法:
class Entry(tornado.web.UIModule): def embedded_css(self): return ".entry { margin-bottom: 1em; }" def render(self, entry, show_comments=False): return self.render_string( "module-entry.html", show_comments=show_comments)
模塊 CSS 和 JavaScript 將被加載(或包含)一次,無(wú)論該模塊在頁(yè)面上使用多少次。CSS 始終包含在頁(yè)面的標(biāo)簽中,而 JavaScript 始終包含在頁(yè)面底部的標(biāo)簽之前。
當(dāng)不需要額外的 Python 代碼時(shí),模板文件本身可以用作模塊。例如,可以將前面的示例重寫為以下 module-entry.html:
{{ set_resources(embedded_css=".entry { margin-bottom: 1em; }") }}
這個(gè)修改后的模塊模塊可以參考:
{% module Template("module-entry.html", show_comments=True) %}
set_resources 函數(shù)只能通過(guò) {% module Template(...) %} 在模板中使用。與 {% include ... %} 指令不同,模板模塊對(duì)于它們的包含模板有一個(gè)明確的命名空間——它們只能看到全局模板命名空間和自己的關(guān)鍵字參數(shù)。
- 上一條美國(guó)弗吉尼亞州駕照翻譯模板樣本 【轉(zhuǎn)載】中國(guó)駕照在美國(guó)哪些州可以用
- 下一條模范學(xué)生獎(jiǎng)狀翻譯模板 獎(jiǎng)狀名稱幼兒園_獎(jiǎng)狀模板幼兒園
相關(guān)閱讀Relate
熱門文章 Recent
- 語(yǔ)種翻譯個(gè)人簡(jiǎn)歷模板 英語(yǔ)翻譯專業(yè)個(gè)人簡(jiǎn)歷模板2023-03-11
- 面試翻譯的簡(jiǎn)歷模板 應(yīng)聘外企必須知道怎么做英文簡(jiǎn)歷2023-03-11
- 電費(fèi)收據(jù)翻譯模板 房租收據(jù)打印大師破解版下載-房租收據(jù)打印大師下載 v3.5.1免費(fèi)版--下載站2023-03-11
- 集體戶口證件翻譯模板 集體戶口辦理護(hù)照的準(zhǔn)備材料及申請(qǐng)流程2023-03-11
- 英語(yǔ)作文寫人的模板帶翻譯 寫人的英語(yǔ)作文:我的姐姐帶翻譯2023-03-11
- 戶口本翻譯成英文標(biāo)準(zhǔn)模板 英文合同翻譯 人工翻譯2023-03-11
- 營(yíng)業(yè)執(zhí)照翻譯模板商事主體 深圳商事登記改革營(yíng)業(yè)執(zhí)照換照熱點(diǎn)問(wèn)題解答(企業(yè)、個(gè)體戶、商事主體更換營(yíng)業(yè)執(zhí)照)2023-03-11
- 泰語(yǔ)翻譯個(gè)人簡(jiǎn)歷模板 優(yōu)秀教師個(gè)人簡(jiǎn)歷范文2023-03-11
- 英國(guó)簽證所需身份證翻譯模板 去英國(guó)旅行辦簽證需要的資料和注意事項(xiàng)有哪些。?2023-03-11
- 法國(guó)學(xué)校錄取通知書翻譯模板-國(guó)外院校錄取通知書翻譯模板2023-03-11