在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 相关文章推荐
pydev使用wxpython找不到路径的解决方法
Feb 10 Python
python实现数值积分的Simpson方法实例分析
Jun 05 Python
python anaconda 安装 环境变量 升级 以及特殊库安装的方法
Jun 21 Python
python绘制铅球的运行轨迹代码分享
Nov 14 Python
python实现kMeans算法
Dec 21 Python
Python解决线性代数问题之矩阵的初等变换方法
Dec 12 Python
python networkx 根据图的权重画图实现
Jul 10 Python
对Django项目中的ORM映射与模糊查询的使用详解
Jul 18 Python
python 实现矩阵按对角线打印
Nov 29 Python
python GUI库图形界面开发之PyQt5信号与槽多窗口数据传递详细使用方法与实例
Mar 08 Python
Python使用matplotlib绘制圆形代码实例
May 27 Python
为了顺利买到演唱会的票用Python制作了自动抢票的脚本
Oct 16 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
php中echo()和print()、require()和include()等易混淆函数的区别
2012/02/22 PHP
改写ThinkPHP的U方法使其路由下分页正常
2014/07/02 PHP
ThinkPHP中使用ajax接收json数据的方法
2014/12/18 PHP
php计算年龄精准到年月日
2015/11/17 PHP
PHP常用的三种设计模式
2017/02/17 PHP
javascript写的一个链表实现代码
2009/10/25 Javascript
JS 密码强度验证(兼容IE,火狐,谷歌)
2010/03/15 Javascript
jquery的ajax提交form表单的两种方法小结(推荐)
2016/05/25 Javascript
JavaScript直播评论发弹幕切图功能点集合效果代码
2016/06/26 Javascript
ionic在开发ios系统微信时键盘挡住输入框的解决方法(键盘弹出问题)
2016/09/06 Javascript
Vue.Js中的$watch()方法总结
2017/03/23 Javascript
bootstrap动态添加面包屑(breadcrumb)及其响应事件的方法
2017/05/25 Javascript
详解ES6中的三种异步解决方案
2018/06/28 Javascript
jQuery利用FormData上传文件实现批量上传
2018/12/04 jQuery
validform表单验证的实现方法
2019/03/08 Javascript
Javascript Web Worker使用过程解析
2020/03/16 Javascript
vue 实现超长文本截取,悬浮框提示
2020/07/29 Javascript
[01:56]林书豪DOTA2上海特级锦标赛励志短片
2016/03/05 DOTA
Django项目中用JS实现加载子页面并传值的方法
2018/05/28 Python
linux安装Python3.4.2的操作方法
2018/09/28 Python
Python闭包和装饰器用法实例详解
2019/05/22 Python
python 机器学习之支持向量机非线性回归SVR模型
2019/06/26 Python
python将logging模块封装成单独模块并实现动态切换Level方式
2020/05/12 Python
详解Python中的路径问题
2020/09/02 Python
HTML5的hidden属性兼容老浏览器的方法
2014/04/23 HTML / CSS
《小石潭记》教学反思
2014/02/13 职场文书
解除劳动合同协议书(样本)
2014/10/02 职场文书
2014年班干部工作总结
2014/11/25 职场文书
承诺保证书格式
2015/02/28 职场文书
2015年简历自我评价范文
2015/03/11 职场文书
学校会议通知范文
2015/04/15 职场文书
2015年社区环境卫生工作总结
2015/04/21 职场文书
安全承诺书格式范本
2015/04/28 职场文书
电子表的操作介绍说明书
2019/10/28 职场文书
MySQL高速缓存启动方法及参数详解(query_cache_size)
2021/07/01 MySQL
Vue+Flask实现图片传输功能
2022/04/01 Vue.js