在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创建进程fork用法
Jun 04 Python
Python中max函数用法实例分析
Jul 17 Python
python装饰器初探(推荐)
Jul 21 Python
解决python文件字符串转列表时遇到空行的问题
Jul 09 Python
Python切片索引用法示例
May 15 Python
mac安装scrapy并创建项目的实例讲解
Jun 13 Python
ubuntu 18.04 安装opencv3.4.5的教程(图解)
Nov 04 Python
wxPython窗体拆分布局基础组件
Nov 19 Python
Python模块的定义,模块的导入,__name__用法实例分析
Jan 07 Python
解决python replace函数替换无效问题
Jan 18 Python
如何基于python实现归一化处理
Jan 20 Python
Python中的sys.stdout.write实现打印刷新功能
Feb 21 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 修改、增加xml结点属性的实现代码
2013/10/22 PHP
PHP批量删除、清除UTF-8文件BOM头的代码实例
2014/04/14 PHP
PHP开发Apache服务器配置
2015/07/15 PHP
PHP文件类型检查及fileinfo模块安装使用详解
2019/05/09 PHP
jQuery 性能优化指南(3)
2009/05/21 Javascript
eclipse导入jquery包后报错的解决方法
2014/02/17 Javascript
js中confirm实现执行操作前弹出确认框的方法
2014/11/01 Javascript
浅谈JavaScript异常处理语句
2015/06/26 Javascript
你所未知的3种Node.js代码优化方式
2016/02/25 Javascript
基于javascript实现全屏漂浮广告
2016/03/31 Javascript
jQuery代码实现对话框右上角菜单带关闭×
2016/05/03 Javascript
老生常谈jquery id选择器和class选择器的区别
2017/02/12 Javascript
原生js实现秒表计时器功能
2017/02/16 Javascript
vue单个组件实现无限层级多选菜单功能
2018/04/10 Javascript
node中使用es6/7/8(支持性与性能)
2019/03/28 Javascript
VUE 实现element upload上传图片到阿里云
2020/08/12 Javascript
Vue中引入svg图标的两种方式
2021/01/14 Vue.js
NestJs使用Mongoose对MongoDB操作的方法
2021/02/22 Javascript
python利用OpenCV2实现人脸检测
2020/04/16 Python
python与sqlite3实现解密chrome cookie实例代码
2018/01/20 Python
用Python实现筛选文件脚本的方法
2018/10/27 Python
Python Django Vue 项目创建过程详解
2019/07/29 Python
在Python中使用filter去除列表中值为假及空字符串的例子
2019/11/18 Python
有趣的Python图片制作之如何用QQ好友头像拼接出里昂
2020/04/22 Python
Django实现后台上传并显示图片功能
2020/05/29 Python
python如何提升爬虫效率
2020/09/27 Python
Python使用Pygame绘制时钟
2020/11/29 Python
机关单位人员学雷锋心得体会
2014/03/10 职场文书
《雕塑之美》教学反思
2014/04/24 职场文书
工作失误检讨书(3篇)
2014/10/11 职场文书
2014年教师业务工作总结
2014/12/19 职场文书
读后感作文评语
2014/12/25 职场文书
人与自然的观后感
2015/06/18 职场文书
Python机器学习三大件之一numpy
2021/05/10 Python
Python使用OpenCV和K-Means聚类对毕业照进行图像分割
2021/06/11 Python
SQL Server数据库查询出现阻塞之性能调优
2022/04/10 SQL Server