模板匹配翻译 模板和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

  • 法国签证营业执照翻译件模板 你与申根签证只有一条推送的距离
  • 江苏省增值税发票翻译模板 江苏税务局出口货物退(免)税申报管理系统软件
  • 肄业证书翻译模板 复旦大学学生学业证明文书管理细则(试行)
  • 四级英语作文模板带翻译 大学英语四级翻译模拟训练及答案
  • 社会某信用代码证翻译模板 js验证某社会信用代码,某社会信用代码 验证js,js+验证+社会信用代码证
  • 美国移民证件翻译模板 日语签证翻译聊聊身份证翻译模板
  • 翻译软件模板 人类史上*实用的的文档快速翻译指南
  • 江苏省增值税发票翻译模板 江苏出口货物退(免)税申报管理服务平台
  • 瑞士签证房产证翻译件模板 瑞士探亲签证—就读子女
  • 日语户口本翻译模板 户口本翻译价格_户口本翻译一般多少钱?
  • 模板匹配翻译 模板和UI¶ www.chinazxzy.com/fymb/9255.html
    
    本站部分内容和图片来源于网络用户和读者投稿,不确定投稿用户享有完全著作权,根据《信息网络传播权保护条例》,如果侵犯了您的权利,请联系:chinazxzy@163.com,及时删除。
    Go To Top 回顶部
    • 扫一扫,微信在线