Django API 提供了几个有用的模块来帮助你翻译你的应用程序. 它们都在django.utils.translation
中使用,我们只需要
fron django.utils.translation import ugettext as _
或者
fron django.utils.translation import ugettext_lazy as _
导入即可使用。
大多数情况下, 我们会使用到ugettext()
和ugettext_lazy()
.
「u」
前缀代表「unicode」
, 因为大多数情况下,我们经常使用 Unicode, 所以使用ugettext()
代替gettext()
, 使用ugettext_lazy()
代替gettext_lazy()
.
顾名思义, lazy该函数是对翻译字符串的引用, 而不是实际翻译的文本. 因此在访问值的时候会进行转换, 而不是调用的时候.
注意这个特性,Django 启动的时候一些特定的代码只执行一次, 比如在models, forms和model forms.
那么, 我们假设在模型定义的时候使用ugettext(), 而不是ugettext_lazy()会怎么样?
- Django 启动, 默认语言是英文.
- Django 选择了英文版的field labels
- 用户将网站语言改为简体中文.
- field labels依然是英文显示.
因为models的字段定义仅仅被执行一次,并且在执行定义代码的时候语言不是简体中文(一般是英文).
要避免这种行为,要必须正确的使用ugettext()
和ugettext_lazy()
下面总结了, 在合适的地方使用合适的函数:
ugettext_lazy():
- models.py (fields, verbose_name, help_text, methods short_description);
- forms.py (labels, help_text, empty_label);
- apps.py (verbose_name).
- settings.py
- 等其他不需要请求执行, 而是在启动执行的模块中
ugettext():
- views.py
- 函数封装的.py文件
- 其他类似于在请求过程中调用的代码,存在于请求一次就需要执行一次的模块中
总结两个方法的特性如下:
ugettext
:预加载的时候调度的翻译方法ugettext_lazy
:请求执行的时候调度的翻译方法
参考文档
- Django小技巧18: ugettext和ugettext_lazy的区别
- Django中 “ugettext” 和 “ugettext_lazy” 对比
- https://simpleisbetterthancomplex.com/tips/2016/10/17/django-tip-18-translations.html