在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之赋值,简单也不简单
Sep 24 Python
python 读取excel文件生成sql文件实例详解
May 12 Python
Python读取sqlite数据库文件的方法分析
Aug 07 Python
基于python代码实现简易滤除数字的方法
Jul 17 Python
详解python运行三种方式
May 13 Python
使用虚拟环境打包python为exe 文件的方法
Aug 29 Python
opencv3/C++实现视频读取、视频写入
Dec 11 Python
PyCharm如何导入python项目的方法
Feb 06 Python
python 进程池pool使用详解
Oct 15 Python
java关于string最常出现的面试题整理
Jan 18 Python
python必学知识之文件操作(建议收藏)
May 30 Python
Python中的tkinter库简单案例详解
Jan 22 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
支持oicq头像的留言簿(二)
2006/10/09 PHP
ThinkPHP在Cli模式下使用模板引擎的方法
2015/09/25 PHP
PHP的Laravel框架中使用消息队列queue及异步队列的方法
2016/03/21 PHP
WordPress过滤垃圾评论的几种主要方法小结
2016/07/11 PHP
js脚本学习 比较实用的基础
2006/09/07 Javascript
(推荐一个超好的JS函数库)S.Sams Lifexperience ScriptClassLib
2007/04/29 Javascript
点击文章内容处弹出页面代码
2009/10/01 Javascript
用Javascript实现Sleep暂停功能代码
2010/09/03 Javascript
基于jQuery的图片剪切插件
2011/08/03 Javascript
jquery遍历之parent()和parents()的区别及parentsUntil()方法详解
2013/12/02 Javascript
关于javaScript注册click事件传递参数的不成功问题
2014/07/18 Javascript
js实现黑色简易的滑动门网页tab选项卡效果
2015/08/31 Javascript
轻松学习jQuery插件EasyUI EasyUI实现树形网络基本操作(2)
2015/11/30 Javascript
nodejs修复ipa处理过的png图片
2016/02/17 NodeJs
浅谈javascript中new操作符的原理
2016/06/07 Javascript
vue2.0在table中实现全选和反选的示例代码
2017/11/04 Javascript
Vue中$refs的用法详解
2018/06/24 Javascript
微信小程序使用swiper组件实现层叠轮播图
2018/11/04 Javascript
jQuery单页面文字搜索插件jquery.fullsearch.js的使用方法
2020/02/04 jQuery
jquery css实现流程进度条
2020/03/26 jQuery
Python在线运行代码助手
2016/07/15 Python
Python学习小技巧之利用字典的默认行为
2017/05/20 Python
用Eclipse写python程序
2018/02/10 Python
python pandas 对series和dataframe的重置索引reindex方法
2018/06/07 Python
pandas去除重复列的实现方法
2019/01/29 Python
pytorch动态网络以及权重共享实例
2020/01/06 Python
如何基于python对接钉钉并获取access_token
2020/04/21 Python
适合各种场合的美食礼品:Harry & David
2016/08/03 全球购物
公益活动策划方案
2014/01/09 职场文书
十八届三中全会宣传方案
2014/02/21 职场文书
入股协议书
2014/04/14 职场文书
大学毕业生求职自荐书
2014/06/05 职场文书
司机工作自我鉴定
2014/09/19 职场文书
2016大学生暑期三下乡心得体会
2016/01/23 职场文书
利用python调用摄像头的实例分析
2021/06/07 Python
Nginx性能优化之Gzip压缩设置详解(最大程度提高页面打开速度)
2022/02/12 Servers