在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 相关文章推荐
Python实现从URL地址提取文件名的方法
May 15 Python
Windows下Python2与Python3两个版本共存的方法详解
Feb 12 Python
Tornado高并发处理方法实例代码
Jan 15 Python
python 日期操作类代码
May 05 Python
Pycharm+Scrapy安装并且初始化项目的方法
Jan 15 Python
python设计微型小说网站(基于Django+Bootstrap框架)
Jul 08 Python
python GUI库图形界面开发之PyQt5中QMainWindow, QWidget以及QDialog的区别和选择
Feb 26 Python
keras输出预测值和真实值方式
Jun 27 Python
Selenium python时间控件输入问题解决方案
Jul 22 Python
python中Tkinter 窗口之输入框和文本框的实现
Apr 12 Python
对PyTorch中inplace字段的全面理解
May 22 Python
python lambda 表达式形式分析
Apr 03 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实现遍历目录并删除指定文件中指定内容
2015/01/21 PHP
php中使用in_array() foreach array_search() 查找数组是否包含时的性能对比
2015/04/14 PHP
通过修改Laravel Auth使用salt和password进行认证用户详解
2017/08/17 PHP
yii2 开发api接口时优雅的处理全局异常的方法
2019/05/14 PHP
PHP大文件分割分片上传实现代码
2020/12/09 PHP
jQuery实现表单input中提示文字value随鼠标焦点移进移出而显示或隐藏的代码
2010/03/21 Javascript
锋利的jQuery 要点归纳(二) jQuery中的DOM操作(下)
2010/03/23 Javascript
jquery.simple.tree插件 更简单,兼容性更好的无限树插件
2010/09/03 Javascript
javascript动态添加、修改、删除对象的属性与方法详解
2014/01/27 Javascript
Javascript冒泡排序算法详解
2014/12/03 Javascript
jQuery mobile 移动web(4)
2015/12/20 Javascript
使用postMesssage()实现iframe跨域页面间的信息传递
2016/03/29 Javascript
Javascript自执行匿名函数(function() { })()的原理浅析
2016/05/15 Javascript
基于d3.js实现实时刷新的折线图
2016/08/03 Javascript
JS倒计时实例_天时分秒
2017/08/22 Javascript
JavaScript实现微信号随机切换代码
2018/03/09 Javascript
Vue从TodoList中学父子组件通信
2019/02/05 Javascript
[03:34]2014DOTA2西雅图国际邀请赛 淘汰赛7月15日TOPPLAY
2014/07/15 DOTA
[05:05]DOTA2亚洲邀请赛 战队出场仪式
2015/02/07 DOTA
python实现猜数字游戏(无重复数字)示例分享
2014/03/29 Python
Python脚本暴力破解栅栏密码
2015/10/19 Python
python使用PIL实现多张图片垂直合并
2019/01/15 Python
Python删除n行后的其他行方法
2019/01/28 Python
python中openpyxl和xlsxwriter对Excel的操作方法
2021/03/01 Python
介绍一下Java中的Class类
2015/04/10 面试题
新员工培训个人的自我评价
2013/10/09 职场文书
跟单文员的岗位职责
2013/11/14 职场文书
校长岗位职责
2013/11/26 职场文书
大学生职业生涯规划书前言
2014/01/09 职场文书
2014年房产经纪人工作总结
2014/12/08 职场文书
英语导游词
2015/02/13 职场文书
婚育证明样本
2015/06/16 职场文书
2016年校园社会综合治理宣传月活动总结
2016/03/16 职场文书
python使用PySimpleGUI设置进度条及控件使用
2021/06/10 Python
画错魏国疆域啦!《派对咖孔明》动画因作画失误于官网致歉
2022/04/07 日漫
mysql数据库实现设置字段长度
2022/06/10 MySQL