在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 的 with 语句详解
Jun 13 Python
使用python在本地电脑上快速处理数据
Jun 22 Python
利用python的socket发送http(s)请求方法示例
May 07 Python
Django model序列化为json的方法示例
Oct 16 Python
Django发送邮件和itsdangerous模块的配合使用解析
Aug 10 Python
django 实现celery动态设置周期任务执行时间
Nov 19 Python
Jupyter notebook运行Spark+Scala教程
Apr 10 Python
Python的Django框架实现数据库查询(不返回QuerySet的方法)
May 19 Python
Python如何优雅删除字符列表空字符及None元素
Jun 25 Python
Python文件操作及内置函数flush原理解析
Oct 13 Python
重构Python代码的六个实例
Nov 25 Python
python 操作excel表格的方法
Dec 05 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 函数语法介绍一
2009/06/14 PHP
PHP的范围解析操作符(::)的含义分析说明
2011/07/03 PHP
php+html5使用FormData对象提交表单及上传图片的方法
2015/02/11 PHP
php输出xml属性的方法
2015/03/19 PHP
Zend Framework教程之模型Model用法简单实例
2016/03/04 PHP
php PDO属性设置与操作方法分析
2018/12/27 PHP
基于JQuery框架的AJAX实例代码
2009/11/03 Javascript
动态加载外部javascript文件的函数代码分享
2011/07/28 Javascript
javascript匿名函数实例分析
2014/11/18 Javascript
node.js中的favicon.ico请求问题处理
2014/12/15 Javascript
JavaScript实现查找字符串中第一个不重复的字符
2014/12/29 Javascript
js中字符串编码函数escape()、encodeURI()、encodeURIComponent()区别详解
2016/04/01 Javascript
jQuery实现三级菜单的代码
2016/05/09 Javascript
jQuery查找节点并获取节点属性的方法
2016/09/09 Javascript
vue.js实现请求数据的方法示例
2017/02/07 Javascript
Vue.js 实现数据展示全部和收起功能
2018/09/05 Javascript
vue中使用props传值的方法
2019/05/08 Javascript
redux处理异步action解决方案
2020/03/22 Javascript
python抓取网页图片示例(python爬虫)
2014/04/27 Python
python去除空格和换行符的实现方法(推荐)
2017/01/04 Python
Python判断一个三位数是否为水仙花数的示例
2018/11/13 Python
python中强大的format函数实例详解
2018/12/05 Python
深入理解Django-Signals信号量
2019/02/19 Python
Python PO设计模式的具体使用
2019/08/16 Python
Python算法中的时间复杂度问题
2019/11/19 Python
Tensorflow 实现将图像与标签数据转化为tfRecord文件
2020/02/17 Python
Reebonz中国官网:新加坡奢侈品购物网站
2017/03/17 全球购物
英国最大的纸工艺品商店:CraftStash
2018/12/01 全球购物
英国蜡烛、蜡烛配件和家居香氛购买网站:Yankee Candle
2018/12/12 全球购物
HQhair美国/加拿大:英国化妆品、美容及美发产品商城
2019/04/15 全球购物
Big Green Smile法国:领先的英国有机和天然产品在线商店
2021/01/02 全球购物
保密普查工作实施方案
2014/02/25 职场文书
买房协议书范本
2014/10/23 职场文书
Python 的 sum() Pythonic 的求和方法详细
2021/10/16 Python
tomcat默认最大连接数及相关调整方法
2022/05/06 Servers
Python可视化神器pyecharts之绘制地理图表练习
2022/07/07 Python