在Django的模型和公用函数中使用惰性翻译对象


Posted in Python onJuly 27, 2015

在模型和公用函数中,使用ugettext_lazy()和ungettext_lazy()来标记字符串是很普遍的操作。 当你在你的代码中其它地方使用这些对象时,你应当确定你不会意外地转换它们成一个字符串,因为它们应被尽量晚地转换(以便正确的地域生效) 这需要使用几个帮助函数。
拼接字符串: string_concat()

标准Python字符串拼接(''.join([...]) ) 将不会工作在包括惰性翻译对象的列表上。 作为替代,你可以使用django.utils.translation.string_concat(), 这个函数创建了一个惰性对象,其连接起它的内容 并且 仅当结果被包括在一个字符串中时转换它们为字符串 。 例如:

from django.utils.translation import string_concat
# ...
name = ugettext_lazy(u'John Lennon')
instrument = ugettext_lazy(u'guitar')
result = string_concat([name, ': ', instrument])

System Message: ERROR/3 (<string>, line 519)

Error in “cnid” directive: no content permitted.

.. cnid:: 109

  在这种情况下,当

System Message: WARNING/2 (<string>, line 523)

Explicit markup ends without a blank line; unexpected unindent.

result 自己被用与一个字符串时, result 中的惰性翻译将仅被转换为字符串(通常在模板渲染时间)。
allow_lazy() 修饰符

Django提供很多功能函数(如:取一个字符串作为他们的第一个参数并且对那个字符串做些什么)。(尤其在 django.utils 中) 这些函数被模板过滤器像在其他代码中一样直接使用。

如果你写你自己的类似函数并且与翻译打交道,当第一个参数是惰性翻译对象时,你会面临“做什么”的难题。 因为你可能在视图之外使用这个函数(并且因此当前线程的本地设置将会不正确),所以你不想立即转换其为一个字符串。

象这种情况,请使用 django.utils.functional.allow_lazy() 修饰符。 它修改这个函数以便 假如第一个参数是一个惰性翻译, 这个函数的赋值会被延后直到它需要被转化为一个字符串为止。

例如:

from django.utils.functional import allow_lazy

def fancy_utility_function(s, ...):
  # Do some conversion on string 's'
  # ...
fancy_utility_function = allow_lazy(fancy_utility_function, unicode)

allow_lazy() 装饰符 采用了另外的函数来装饰,以及一定量的,原始函数可以返回的特定类型的额外参数 (*args ) 。 通常,在这里包括 unicode 就足够了并且确定你的函数将仅返回Unicode字符串。

使用这个修饰符意味着你能写你的函数并且假设输入是合适的字符串,然后在末尾添加对惰性翻译对象的支持。

Python 相关文章推荐
Python3实现Web网页图片下载
Jan 28 Python
简单实现Python爬取网络图片
Apr 01 Python
python的继承知识点总结
Dec 10 Python
对python3 中方法各种参数和返回值详解
Dec 15 Python
Python绘制并保存指定大小图像的方法
Jan 10 Python
在python中利用numpy求解多项式以及多项式拟合的方法
Jul 03 Python
django 快速启动数据库客户端程序的方法示例
Aug 16 Python
Python While循环语句实例演示及原理解析
Jan 03 Python
python实现logistic分类算法代码
Feb 28 Python
Python爬虫实现HTTP网络请求多种实现方式
Jun 19 Python
使用npy转image图像并保存的实例
Jul 01 Python
Python第三方包PrettyTable安装及用法解析
Jul 08 Python
使用Django的模版来配合字符串翻译工作
Jul 27 #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
You might like
超神学院:鹤熙已踏入神圣领域,实力不比凯莎弱
2020/03/02 国漫
ThinkPHP3.0略缩图不能保存到子目录的解决方法
2012/09/30 PHP
隐性调用php程序的方法
2015/06/13 PHP
基于OpenCart 开发支付宝,财付通,微信支付参数错误问题
2015/10/01 PHP
PHP中include/require/include_once/require_once使用心得
2016/08/28 PHP
PHP用正则匹配form表单中所有元素的类型和属性值实例代码
2017/02/28 PHP
浅谈PHP无限极分类原理
2019/03/14 PHP
extjs 学习笔记(二) Ext.Element类
2009/10/13 Javascript
js 中{},[]中括号,大括号使用详解
2011/05/12 Javascript
用js来定义浏览器中一个左右浮动元素相对于页面主体宽度的位置的函数
2012/01/21 Javascript
jquery1.9 下检测浏览器类型和版本的方法
2013/12/26 Javascript
利用js读取动态网站从服务器端返回的数据
2014/02/10 Javascript
网页下载文件期间如何防止用户对网页进行其他操作
2014/06/27 Javascript
javascript 回调函数详解
2014/11/11 Javascript
轻松创建nodejs服务器(8):非阻塞是如何实现的
2014/12/18 NodeJs
JS实现兼容性好,自动置顶的淘宝悬浮工具栏效果
2015/09/18 Javascript
Jquery鼠标放上去显示全名的实现方法
2017/02/06 Javascript
jquery实现静态搜索功能(可输入搜索文字)
2017/03/28 jQuery
JS实现数组按升序及降序排列的方法
2017/04/26 Javascript
详解VUE 定义全局变量的几种实现方式
2017/06/01 Javascript
JS 中使用Promise 实现红绿灯实例代码(demo)
2017/10/20 Javascript
使用vue-aplayer插件时出现的问题的解决
2018/03/02 Javascript
angular4 获取wifi列表中文显示乱码问题的解决
2018/10/20 Javascript
es6 symbol的实现方法示例
2019/04/02 Javascript
对Layer UI 模块化的用法详解
2019/09/26 Javascript
javascript将扁平的数据转为树形结构的高效率算法
2020/02/27 Javascript
python实现dnspod自动更新dns解析的方法
2014/02/14 Python
python实现的登录和操作开心网脚本分享
2014/07/09 Python
Python实现批量把SVG格式转成png、pdf格式的代码分享
2014/08/21 Python
在Python中封装GObject模块进行图形化程序编程的教程
2015/04/14 Python
使用Python的Tornado框架实现一个一对一聊天的程序
2015/04/25 Python
Python进行数据提取的方法总结
2016/08/22 Python
Python人脸识别初探
2017/12/21 Python
Python的argparse库使用详解
2018/10/09 Python
Python 变量的创建过程详解
2019/09/02 Python
使用pyshp包进行shapefile文件修改的例子
2019/12/06 Python