模板匹配翻译 模板和UI¶
日期:2023-03-11 12:39:36 / 人气: 480 / 发布者:成都翻译公司
模板和UI配置模板如果你不同的处理函数有不同的模板路径).模板语法Tornado模板被直接转换为Python.包含在你模板中的表达式会逐字的复制到一个代表你模板的Python函数中.翻译函数有两种形式:是可以根据第三个参数的值来翻译字符串单复数的.一个模板文件本身可以作为一个模块.模板和用户界面
Tornado 包含一种简单、快速且灵活的模板语言。本节介绍语言和相关问题,例如国际化。
Tornado 也可以使用其他 Python 模板语言,尽管没有计划将这些系统集成到其中。相反,它只是将模板转换为字符串并将其传递给
配置模板
默认情况下,Tornado 将在与当前 .py 文件相同的目录中查找关联的模板文件。如果要将模板文件放在不同的目录中,可以使用 template_path (如果不同的处理函数具有不同的模板路径,则可以覆盖)。
为了从非文件系统位置加载模板,请实例化子类并在应用程序设置中为其配置 template_loader。
默认情况下,编译后的模板会被缓存;为了关闭此缓存并使更改(对目标)在重新加载后始终可见,请在应用程序设置中使用compiled_template_cache=False 或debug=True。
模板语法
Tornado 模板只是将 Python 控制序列和表达式嵌入 HTML(或任何其他文本格式)文件中,并带有一些标记:
<html> <head> <title>{{ title }}title> head> <body> <ul> {% for item in items %} <li>{{ escape(item) }}li> {% end %} ul> body> html>
如果将此目标另存为“template.html”并将其放在与 Python 文件相同的目录中,则可以使用以下代码呈现它:
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 模板支持控制语句和表达式。控制语句包含在 {% 和 %} 中,例如 {% if len(items)> 2 %}。表达式被包裹在 {{ 和 }} 之间,例如,{{ items[0] }}。
控制语句或多或少类似于 Python 语句。我们支持 if、for、while 和 try,它们必须使用 {% end %} 来标记结束。我们也支持使用extends和block标签的模板继承Statement,这些内容的细节可以看。
表达式可以是任何 Python 表达式,包括函数调用。模板代码将在包含以下对象和函数的命名空间中执行(注意,此列表适用于模板的使用和渲染。如果直接在外部使用该模块,则下面的许多不存在)。
当您构建一个真正的应用程序时,您可能希望使用 Tornado 模板的所有功能,尤其是目标继承。在 部分阅读所有关于这些特性的信息(一些特性,包括 UIModules 是在模块中实现的)
在引擎下,Tornado 模板直接转换为 Python。模板中包含的表达式将被逐字复制到表示模板的 Python 函数中。我们不会试图阻止模板语言中的任何内容;我们很清楚创建一个高度灵活的模板系统,而不是一个严格限制的模板系统。因此,如果随意在模板表达式中填充(代码),执行时也会出现各种随机错误。
默认情况下,所有模板输出都将使用函数转义。可以通过将 autoescape=None 传递给或构造函数来全局更改此行为。对于模板文件,您可以使用 {% autoescape None %} 指令,对于单个表达式,您可以使用 {% raw ...%} 而不是 {{ ... }}。此外,每个地方都可以使用可选的转义函数名称代替 None 。
请注意,虽然 Tornado 的自动转义有助于防止 XSS 漏洞,但它并不适用于所有情况。出现在特定位置的表达式,例如 Javascript 或 CSS,可能需要额外的转义。此外,您必须小心始终在可能包含不受信任内容的 HTML 中使用双引号,或者您必须在属性中使用单独的转义函数(参见例如)
全球化
当前用户的语言环境(无论他们是否登录)始终可以通过在请求处理程序中使用 self.locale 或在模板中使用语言环境来访问。语言环境的名称(例如,en_US)可以通过locale.name 获得,也可以通过方法翻译字符串。该模板还有一个名为 _() 的全局函数,用于字符串翻译。翻译函数有两种形式:
_("Translate this string")
它是根据当前的区域设置直接翻译的,并且:
_("A person liked this", "%(num)d people liked this", len(people)) % {"num": len(people)}
可以根据第三个参数的值翻译字符串单数和复数。在上面的例子中,如果 len(people) 为 1,则返回第一句的翻译,否则返回第二句的翻译。
*常见的翻译模式四使用 Python 来命名占位符变量(上例中的 %(num)d),因为占位符在翻译过程中可能会发生变化。
这是一个正确的国际化模板:
<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>
默认情况下,我们使用用户浏览器发送的 Accept-Language 标头来发现用户的语言环境。如果我们没有找到合适的 Accept-Language 值,我们将使用 en_US。如果您让用户设置他们的首选语言环境,您可以通过覆盖来覆盖默认选定区域:
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,那么我们(继续)依靠 Accept-Language 标头(做出判断)。
该模块支持两种形式的加载翻译:一种是带有相关工具的.mo格式,另一种是简单的.csv格式。应用程序通常在启动时调用一次或其中之一;检查这些方法以获取有关支持格式的更多详细信息..
您可以使用您的应用程序支持的区域(设置)列表。通过从支持的区域中选择*接近的匹配来获得用户的区域。例如,如果用户所在的区域是 es_GT,并且支持 es 区域模板匹配翻译,则请求中的 self.locale 将设置为 es。如果未找到*接近的匹配项,我们将使用 en_US。
用户界面模块
Tornado 支持 UI 模块模板匹配翻译,以便在您的应用程序中轻松支持标准和重用 UI 组件。UI 模块就像在页面上渲染组件的特殊函数调用,它们可以包装自己的 CSS 和 JavaScript。
例如,如果您实现了一个博客,并且您希望一个博客条目出现在主页和每个博客页面上,您可以实现一个 Entry 模块来在这些页面上呈现它们。首先,为您的 UI 模块创建一个 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)
在您的应用程序设置中,使用 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 %} 语法调用模块。例如,您可以从 home.html 调用 Entry 模块:
{% for entry in entries %} {% module Entry(entry) %} {% end %}
和 entry.html:
{% module Entry(entry, show_comments=True) %}
模块可以包含自定义 CSS 和 JavaScript 函数,方法是覆盖 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 将被加载(或包含)一次,无论该模块在页面上使用多少次。CSS 始终包含在页面的标签中,而 JavaScript 始终包含在页面底部的标签之前。
当不需要额外的 Python 代码时,模板文件本身可以用作模块。例如,可以将前面的示例重写为以下 module-entry.html:
{{ set_resources(embedded_css=".entry { margin-bottom: 1em; }") }}
这个修改后的模块模块可以参考:
{% module Template("module-entry.html", show_comments=True) %}
set_resources 函数只能通过 {% module Template(...) %} 在模板中使用。与 {% include ... %} 指令不同,模板模块对于它们的包含模板有一个明确的命名空间——它们只能看到全局模板命名空间和自己的关键字参数。
相关阅读Relate
热门文章 Recent
- 驾驶证翻译件模板 【*新2017年驾驶证年审新规定】*新2017年驾驶证年审新规定2023-03-11
- 六级翻译做题模板 英语六级翻译答题技巧(英语六级范文)2023-03-11
- 加拿大签证行驶证翻译模板 2021年加拿大签证所需材料有哪些?一定需要面试吗?2023-03-11
- 昆特兰理工大学学位证书翻译模板 昆特兰理工大学 Kwantlen Polytechnic University2023-03-11
- 等证件的公证翻译模板 涉外公证翻译中应注意的几个问题2023-03-11
- 四级作文模板及翻译 英语四级作文万能2023-03-11
- 香港企业雇佣合同英译汉翻译模板 专业劳动合同翻译_劳动合同翻译公司_劳动合同翻译价格2023-03-11
- 语文文言文翻译模板 高考文言文翻译技巧 怎样提高语文成绩2023-03-11
- 迪拜驾照翻译模板 中国驾照在迪拜能用吗2023-03-11
- 信用证明模板翻译2023-03-11


