使用Django的模版来配合字符串翻译工作
Django模板使用两种模板标签,且语法格式与Python代码有些许不同。为了使得模板访问到标签,需要将{%loadi18n%}放在模板最前面。
这个{%trans%}模板标记翻译一个常量字符串(括以单或双引号)或可变内容:
<title>{%trans"Thisisthetitle."%}</title> <title>{%transmyvar%}</title>
如果有noop选项,变量查询还是有效但翻译会跳过。当空缺内容要求将来再翻译时,这很有用。
<title>{%trans"myvar"noop%}</title>
在一个带{%trans%}的字符串中,混进一个模板变量是不可能的。如果你的译文要求字符串带有变量(占位符placeholders),请使用{%blocktrans%}:
{%blocktrans%}Thisstringwillhave{{value}}inside.{%endblocktrans%}
使用模板过滤器来翻译一个模板表达式,需要在翻译的这段文本中将表达式绑定到一个本地变量中:
{%blocktranswithvalue|filterasmyvar%} Thiswillhave{{myvar}}inside. {%endblocktrans%}
如果需要在blocktrans标签内绑定多个表达式,可以用and来分隔:
{%blocktranswithbook|titleasbook_tandauthor|titleasauthor_t%} Thisis{{book_t}}by{{author_t}} {%endblocktrans%}
为了表示单复数相关的内容,需要在{%blocktrans%}和{%endblocktrans%}之间使用{%plural%}标签来指定单复数形式,例如:
{%blocktranscountlist|lengthascounter%} Thereisonlyone{{name}}object. {%plural%} Thereare{{counter}}{{name}}objects. {%endblocktrans%}
其内在机制是,所有的块和内嵌翻译调用相应的gettext或ngettext。
每一个RequestContext可以访问三个指定翻译变量:
- {{LANGUAGES}}是一系列元组组成的列表,每个元组的第一个元素是语言代码,第二个元素是用该语言表示的语言名称。
- 作为一二字符串,LANGUAGE_CODE是当前用户的优先语言。例如:en-us。(请参见下面的Django如何发现语言偏好)
- LANGUAGE_BIDI就是当前地域的说明。如果为真(True),它就是从右向左书写的语言,例如:希伯来语,阿拉伯语。如果为假(False),它就是从左到右书写的语言,如:英语,法语,德语等。
如果你不用这个RequestContext扩展,你可以用3个标记到那些值:
{%get_current_languageasLANGUAGE_CODE%} {%get_available_languagesasLANGUAGES%} {%get_current_language_bidiasLANGUAGE_BIDI%}
这些标记亦要求一个{%loadi18n%}。
翻译的hook在任何接受常量字符串的模板块标签内也是可以使用的。此时,使用_()表达式来指定翻译字符串,例如:
{%some_special_tag_("Pagenotfound")value|yesno:_("yes,no")%}
在这种情况下,标记和过滤器两个都会看到已经翻译的字符串,所有它们并不需要提防翻译操作。
备注:
在这个例子中,翻译结构将放过字符串"yes,no",而不是单独的字符串"yes"和"no"。翻译的字符串将需要包括逗号以便过滤器解析代码明白如何分割参数。例如,一个德语翻译器可能会翻译字符串"yes,no"为"ja,nein"(保持逗号原封不动)。