使用Django的模版来配合字符串翻译工作

作者:goldensun 时间:2023-11-17 06:03:47 

Django模板使用两种模板标签,且语法格式与Python代码有些许不同。 为了使得模板访问到标签,需要将 {% load i18n %} 放在模板最前面。

这个{% trans %}模板标记翻译一个常量字符串 (括以单或双引号) 或 可变内容:


<title>{% trans "This is the title." %}</title>
<title>{% trans myvar %}</title>

如果有noop 选项,变量查询还是有效但翻译会跳过。 当空缺内容要求将来再翻译时,这很有用。


<title>{% trans "myvar" noop %}</title>

在一个带 {% trans %} 的字符串中,混进一个模板变量是不可能的。如果你的译文要求字符串带有变量(占位符placeholders),请使用 {% blocktrans %} :


{% blocktrans %}This string will have {{ value }} inside.{% endblocktrans %}

使用模板过滤器来翻译一个模板表达式,需要在翻译的这段文本中将表达式绑定到一个本地变量中:


{% blocktrans with value|filter as myvar %}
This will have {{ myvar }} inside.
{% endblocktrans %}

如果需要在 blocktrans 标签内绑定多个表达式,可以用 and 来分隔:


{% blocktrans with book|title as book_t and author|title as author_t %}
This is {{ book_t }} by {{ author_t }}
{% endblocktrans %}

为了表示单复数相关的内容,需要在 {% blocktrans %} 和 {% endblocktrans %} 之间使用 {% plural %} 标签来指定单复数形式,例如:


{% blocktrans count list|length as counter %}
There is only one {{ name }} object.
{% plural %}
There are {{ counter }} {{ name }} objects.
{% endblocktrans %}

其内在机制是,所有的块和内嵌翻译调用相应的 gettext 或 ngettext 。

每一个RequestContext可以访问三个指定翻译变量:

  1.     {{ LANGUAGES }} 是一系列元组组成的列表,每个元组的第一个元素是语言代码,第二个元素是用该语言表示的语言名称。

  2.     作为一二字符串,LANGUAGE_CODE是当前用户的优先语言。 例如: en-us。(请参见下面的Django如何发现语言偏好)

  3.     LANGUAGE_BIDI就是当前地域的说明。 如果为真(True),它就是从右向左书写的语言,例如: 希伯来语,阿拉伯语。 如果为假(False),它就是从左到右书写的语言,如: 英语,法语,德语等。

如果你不用这个RequestContext扩展,你可以用3个标记到那些值:


{% get_current_language as LANGUAGE_CODE %}
{% get_available_languages as LANGUAGES %}
{% get_current_language_bidi as LANGUAGE_BIDI %}

这些标记亦要求一个 {% load i18n %} 。

翻译的hook在任何接受常量字符串的模板块标签内也是可以使用的。 此时,使用 _() 表达式来指定翻译字符串,例如:


{% some_special_tag _("Page not found") value|yesno:_("yes,no") %}

在这种情况下,标记和过滤器两个都会看到已经翻译的字符串,所有它们并不需要提防翻译操作。

备注:

在这个例子中,翻译结构将放过字符串"yes,no",而不是单独的字符串"yes"和"no"。翻译的字符串将需要包括逗号以便过滤器解析代码明白如何分割参数。 例如, 一个德语翻译器可能会翻译字符串 "yes,no" 为 "ja,nein" (保持逗号原封不动)。

标签:Django,翻译
0
投稿

猜你喜欢

  • JS 逻辑判断不要只知道用 if-else 和 switch条件判断(小技巧)

    2024-04-17 09:52:06
  • 详解Go语言中切片的长度与容量的区别

    2024-04-25 15:05:32
  • ubuntu16.04制作vim和python3的开发环境

    2022-08-11 00:11:07
  • Python3实现将文件归档到zip文件及从zip文件中读取数据的方法

    2021-07-03 18:21:00
  • uni-app使用countdown插件实现倒计时

    2024-05-10 14:15:14
  • 深入理解python 生成器、迭代器、动态新增属性及方法

    2023-11-13 03:04:32
  • Python 概率生成问题案例详解

    2023-11-26 19:04:58
  • 发个选星星打分/投票功能函数

    2008-05-22 12:38:00
  • Vue的el-scrollbar实现自定义滚动

    2021-08-16 19:06:22
  • python发送邮件功能实现代码

    2021-04-20 13:51:28
  • 详解python做UI界面的方法

    2023-05-24 08:07:41
  • ASP.NET(C#)中操作SQLite数据库实例

    2024-01-20 08:30:12
  • Numpy中转置transpose、T和swapaxes的实例讲解

    2022-09-04 21:11:10
  • 实现页面中按钮刷新的N种方法

    2007-02-03 11:06:00
  • Python3如何对urllib和urllib2进行重构

    2022-05-18 08:48:52
  • python中openpyxl库用法详解

    2023-07-15 09:53:45
  • Python脚本完成post接口测试的实例

    2022-01-01 15:40:22
  • python字符串排序方法

    2023-11-16 10:44:18
  • php filter协议使用方法

    2023-05-29 19:36:40
  • js清空form表单中的内容示例

    2023-08-23 16:22:02
  • asp之家 网络编程 m.aspxhome.com