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


Posted in Python onJuly 27, 2015

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" (保持逗号原封不动)。

Python 相关文章推荐
python批量修改文件名的实现代码
Sep 01 Python
使用Python简单的实现树莓派的WEB控制
Feb 18 Python
详解python调度框架APScheduler使用
Mar 28 Python
CentOS 6.5下安装Python 3.5.2(与Python2并存)
Jun 05 Python
简述:我为什么选择Python而不是Matlab和R语言
Nov 14 Python
Python中协程用法代码详解
Feb 10 Python
python中实现将多个print输出合成一个数组
Apr 19 Python
详解django的serializer序列化model几种方法
Oct 16 Python
pandas.dataframe按行索引表达式选取方法
Oct 30 Python
Python实用工具FuckIt.py介绍
Jul 02 Python
解决Python使用列表副本的问题
Dec 19 Python
Python用户自定义异常的实现
Dec 25 Python
Django中的“惰性翻译”方法的相关使用
Jul 27 #Python
在Python中的Django框架中进行字符串翻译
Jul 27 #Python
Python中特殊函数集锦
Jul 27 #Python
Python实现截屏的函数
Jul 26 #Python
Python计算已经过去多少个周末的方法
Jul 25 #Python
Python基于动态规划算法计算单词距离
Jul 25 #Python
Python中Django框架利用url来控制登录的方法
Jul 25 #Python
You might like
一个颜色轮换的简单例子
2006/10/09 PHP
Smarty+QUICKFORM小小演示
2007/02/25 PHP
php自动加载的两种实现方法
2010/06/21 PHP
php中url函数介绍及使用示例
2014/02/13 PHP
Yii 2.0自带的验证码使用经验分享
2017/06/19 PHP
php命令行写shell实例详解
2018/07/19 PHP
zTree插件之单选下拉菜单实例代码
2013/11/07 Javascript
javascript中的if语句使用介绍
2013/11/20 Javascript
JavaScript中eval()函数用法详解
2015/12/14 Javascript
JS DOMReady事件的六种实现方法总结
2016/11/23 Javascript
jQuery插件HighCharts绘制2D柱状图、折线图和饼图的组合图效果示例【附demo源码下载】
2017/03/09 Javascript
Echarts动态加载多条折线图的实现代码
2019/05/24 Javascript
简单了解微信小程序的目录结构
2019/07/01 Javascript
React 条件渲染最佳实践小结(7种)
2020/09/27 Javascript
Python合并多个装饰器小技巧
2015/04/28 Python
详解Python中的strftime()方法的使用
2015/05/22 Python
python目录与文件名操作例子
2016/08/28 Python
python实现关键词提取的示例讲解
2018/04/28 Python
扩展Django admin的list_filter()可使用范围方法
2019/08/21 Python
使用Django xadmin 实现修改时间选择器为不可输入状态
2020/03/30 Python
Django封装交互接口代码
2020/07/12 Python
python里glob模块知识点总结
2021/01/05 Python
python Protobuf定义消息类型知识点讲解
2021/03/02 Python
Nordgreen台湾官网:极简北欧设计手表
2019/08/21 全球购物
《蜗牛》教学反思
2014/02/18 职场文书
答谢会策划方案
2014/05/12 职场文书
寒暑假实习证明书模板
2014/11/29 职场文书
2015年七一建党节活动方案
2015/05/05 职场文书
于丹论语心得观后感
2015/06/15 职场文书
2015年医院保卫科工作总结
2015/07/23 职场文书
安全事故隐患排查治理制度
2015/08/05 职场文书
秀!学妹看见都惊呆的Python小招数!【详细语言特性使用技巧】
2021/04/27 Python
解决Vue+SpringBoot+Shiro跨域问题
2021/06/09 Vue.js
Redis 常见使用场景
2021/08/30 Redis
Python作用域和名称空间的详细介绍
2022/04/13 Python
Mysql中常用的join连接方式
2022/05/11 MySQL