在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发送邮件的实例代码(支持html、图片、附件)
Mar 04 Python
Python利用多进程将大量数据放入有限内存的教程
Apr 01 Python
探究数组排序提升Python程序的循环的运行效率的原因
Apr 01 Python
详解Python中的多线程编程
Apr 09 Python
详解Python中的__new__()方法的使用
Apr 09 Python
Python制作数据导入导出工具
Jul 31 Python
Django中针对基于类的视图添加csrf_exempt实例代码
Feb 11 Python
Python中 map()函数的用法详解
Jul 10 Python
pytorch实现对输入超过三通道的数据进行训练
Jan 15 Python
python调用摄像头的示例代码
Sep 28 Python
django中ImageField的使用详解
Dec 21 Python
Python编写冷笑话生成器
Apr 20 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 面试碰到过的问题 在此做下记录
2011/06/09 PHP
PHP基础之运算符的使用方法
2013/04/28 PHP
php比较两个绝对时间的大小
2014/01/31 PHP
PHP实现图片压缩的两则实例
2014/07/19 PHP
UTF-8正则表达式如何匹配汉字
2015/08/03 PHP
CI框架整合smarty步骤详解
2016/05/19 PHP
Yii2主题(Theme)用法详解
2016/07/23 PHP
php使用正则表达式去掉html中的注释方法
2016/11/03 PHP
javascript实现TreeView 无刷新展开的实例代码
2013/07/13 Javascript
JQUERY简单按钮轮换选中效果实现方法
2015/05/07 Javascript
jQuery实现每隔几条元素增加1条线的方法
2016/06/27 Javascript
javascript简单实现等比例缩小图片的方法
2016/07/27 Javascript
常用原生js自定义函数总结
2016/11/20 Javascript
Ajax跨域实现代码(后台jsp)
2017/01/21 Javascript
vue.js之vue-cli脚手架的搭建详解
2017/05/05 Javascript
Javascript快速实现浏览器系统通知
2017/08/26 Javascript
vue.js element-ui validate中代码不执行问题解决方法
2017/12/18 Javascript
layui 监听表格复选框选中值的方法
2018/08/15 Javascript
利用vue重构有赞商城的思路以及总结整理
2019/02/21 Javascript
使用vue实现HTML页面生成图片的方法
2020/03/12 Javascript
JQuery表单元素取值赋值方法总结
2020/05/12 jQuery
[44:22]完美世界DOTA2联赛循环赛 FTD vs PXG BO2第一场 11.01
2020/11/02 DOTA
python中sets模块的用法实例
2014/09/30 Python
python正则表达式re之compile函数解析
2017/10/25 Python
对Python3 goto 语句的使用方法详解
2019/02/16 Python
新手如何发布Python项目开源包过程详解
2019/07/11 Python
python实现UDP协议下的文件传输
2020/03/20 Python
Python中如何引入第三方模块
2020/05/27 Python
马来西亚最大的电器网站:Senheng
2017/10/13 全球购物
Skyscanner波兰:廉价航班
2017/11/07 全球购物
Puccini乌克兰:购买行李箱、女士手袋网上商店
2020/08/06 全球购物
2014年社区矫正工作总结
2014/11/18 职场文书
放射科岗位职责
2015/02/14 职场文书
JS Canvas接口和动画效果大全
2021/04/29 Javascript
Redis数据结构之链表与字典的使用
2021/05/11 Redis
Python中time标准库的使用教程
2022/04/13 Python