Django中的“惰性翻译”方法的相关使用


Posted in Python onJuly 27, 2015

使用 django.utils.translation.gettext_lazy() 函数,使得其中的值只有在访问时才会被翻译,而不是在 gettext_lazy() 被调用时翻译。

例如:要翻译一个模型的 help_text,按以下进行:

from django.utils.translation import ugettext_lazy

class MyThing(models.Model):
  name = models.CharField(help_text=ugettext_lazy('This is the help text'))

在这个例子中, ugettext_lazy() 将字符串作为惰性参照存储,而不是实际翻译。 翻译工作将在字符串在字符串上下文中被用到时进行,比如在Django管理页面提交模板时。

在Python中,无论何处你要使用一个unicode 字符串(一个unicode 类型的对象),您都可以使用一个 ugettext_lazy() 调用的结果。 一个ugettext_lazy()对象并不知道如何把它自己转换成一个字节串。如果你尝试在一个需要字节串的地方使用它,事情将不会如你期待的那样。 同样,你也不能在一个字节串中使用一个 unicode 字符串。所以,这同常规的Python行为是一致的。 例如:

# This is fine: putting a unicode proxy into a unicode string.
u"Hello %s" % ugettext_lazy("people")

# This will not work, since you cannot insert a unicode object
# into a bytestring (nor can you insert our unicode proxy there)
"Hello %s" % ugettext_lazy("people")

如果你曾经见到到像"hello"这样的输出,你就可能在一个字节串中插入了ugettext_lazy()的结果。 在您的代码中,那是一个漏洞。

如果觉得 gettext_lazy 太过冗长,可以用 _ (下划线)作为别名,就像这样:

from django.utils.translation import ugettext_lazy as _

class MyThing(models.Model):
  name = models.CharField(help_text=_('This is the help text'))

在Django模型中总是无一例外的使用惰性翻译。 为了翻译,字段名和表名应该被标记。(否则的话,在管理界面中它们将不会被翻译) 这意味着在Meta类中显式地编写verbose_nane和verbose_name_plural选项,而不是依赖于Django默认的verbose_name和verbose_name_plural(通过检查model的类名得到)。

from django.utils.translation import ugettext_lazy as _

class MyThing(models.Model):
  name = models.CharField(_('name'), help_text=_('This is the help text'))
  class Meta:
    verbose_name = _('my thing')
    verbose_name_plural = _('mythings')
Python 相关文章推荐
python生成指定尺寸缩略图的示例
May 07 Python
Python运用于数据分析的简单教程
Mar 27 Python
在Python的Django框架中使用通用视图的方法
Jul 21 Python
Python使用dis模块把Python反编译为字节码的用法详解
Jun 14 Python
解析Python中的生成器及其与迭代器的差异
Jun 20 Python
使用python在本地电脑上快速处理数据
Jun 22 Python
对Tensorflow中的矩阵运算函数详解
Jul 27 Python
使用Python抓取豆瓣影评数据的方法
Oct 17 Python
python requests 库请求带有文件参数的接口实例
Jan 03 Python
Python2比较当前图片跟图库哪个图片相似的方法示例
Sep 28 Python
使用python自动追踪你的快递(物流推送邮箱)
Mar 17 Python
pygame面向对象的飞行小鸟实现(Flappy bird)
Apr 01 Python
在Python中的Django框架中进行字符串翻译
Jul 27 #Python
Python中特殊函数集锦
Jul 27 #Python
Python实现截屏的函数
Jul 26 #Python
Python计算已经过去多少个周末的方法
Jul 25 #Python
Python基于动态规划算法计算单词距离
Jul 25 #Python
Python中Django框架利用url来控制登录的方法
Jul 25 #Python
Python实现模拟登录及表单提交的方法
Jul 25 #Python
You might like
为什么《星际争霸》是测试人工智能的理想战场
2019/12/03 星际争霸
PHP警告Cannot use a scalar value as an array的解决方法
2012/01/11 PHP
php插入排序法实现数组排序实例
2015/02/16 PHP
Laravel 5 框架入门(三)
2015/04/09 PHP
PHP记录页面停留时间的方法
2016/03/30 PHP
浅析Yii2缓存的使用
2016/05/10 PHP
PHP页面静态化――纯静态与伪静态用法详解
2020/06/05 PHP
Jquery 插件开发笔记整理
2011/01/17 Javascript
不用锚点也可以平滑滚动到页面的指定位置实现代码
2013/05/08 Javascript
jQuery-1.9.1源码分析系列(十)事件系统之事件包装
2015/11/20 Javascript
jQuery验证插件validate使用方法详解
2020/09/13 Javascript
jQuery Ajax 异步加载显示等待效果代码分享
2016/08/01 Javascript
mac上配置Android环境变量的方法
2018/07/08 Javascript
解决axios发送post请求返回400状态码的问题
2018/08/11 Javascript
详解为生产环境编译Angular2应用的方法
2018/12/10 Javascript
vue改变循环遍历后的数据实例
2019/11/07 Javascript
[05:13]2018DOTA2亚洲邀请赛主赛事第二日战况回顾 LGD、VG双雄携手晋级
2018/04/05 DOTA
[01:54]TI珍贵瞬间系列(三):翻盘
2020/08/28 DOTA
Python深入学习之上下文管理器
2014/08/31 Python
Python中Class类用法实例分析
2015/11/12 Python
解决python3中自定义wsgi函数,make_server函数报错的问题
2017/11/21 Python
python实现单链表中删除倒数第K个节点的方法
2018/09/28 Python
用Python实现读写锁的示例代码
2018/11/05 Python
python并发编程 Process对象的其他属性方法join方法详解
2019/08/20 Python
使用Python画出小人发射爱心的代码
2019/11/23 Python
python selenium实现发送带附件的邮件代码实例
2019/12/10 Python
在pycharm中实现删除bookmark
2020/02/14 Python
css3实例教程 一款纯css3实现的环形导航菜单
2014/10/20 HTML / CSS
利用HTML5的新特点实现图片文件异步上传
2014/05/29 HTML / CSS
Bose英国官方网站:美国知名音响品牌
2020/01/26 全球购物
电子商务专业学生的学习自我评价
2013/10/27 职场文书
学生个人的自我评价分享
2013/11/05 职场文书
银行员工职业规划范文
2014/01/21 职场文书
大学生个人求职信例文
2014/07/07 职场文书
七年级作文之雪景
2019/11/18 职场文书
PHP对接阿里云虚拟号的实现(号码隐私保护)
2021/04/06 PHP