一、translation机制简介

为了使django项目具有可翻译性,必须向Python代码和模板添加最少数量的钩子。这些钩子称为翻译字符串(tanslation strings)。他们告诉Django:“如果可以使用该语言翻译该文本,则应将文本翻译为最终用户的语言。”因此,标记可翻译字符串是您的责任,系统只能翻译它知道的字符串。

Django提供了将tanslation strings提取到一个message文件中的功能。此文件为翻译人员提供了一种将tanslation strings与目标语言一一对应的简便方法。一旦翻译人员填写了message文件,就必须对其进行编译。这个过程依赖于 GNU gettext工具集。

二、translation相关的定义

internationalization

准备软件进行本地化。通常由开发人员完成。

localization

编写翻译和本地格式。通常由翻译人员完成。更多的细节可以查看 W3C Web Internationalization FAQ, the Wikipedia article or the GNU gettext documentation.

locale name

区域设置名称,可以是表单ll的语言规范,也可以是表单ll_cc的组合语言和国家规范。示例:it、de_AT、es、pt_BR。语言部分总是小写,国家部分总是大写。分隔符是下划线

language code

表示语言的名称。浏览器与HTTP头均接受该语言名称形成。示例:it、de-at、es、pt-br。语言代码通常用小写表示,但HTTP Accept语言头不区分大小写。分隔符是破折号

message file

消息文件是一个纯文本文件,表示一种语言,它包含所有可用的translation string以及它们在给定语言中的表示方式。消息文件具有.po文件扩展名。

translation string

能够被翻译的字符串

format file

格式文件是一个定义给定区域设置数据格式的python模块。

三、Internationalization

Standard translation

指定一个translation string 使用gettext()函数,通过inport并做为别名_是常见的形式,如下:

from django.http import HttpResponse
from django.utils.translation import gettext as _def my_view(request):output = _("Welcome to my site.")return HttpResponse(output)

注意:在gettext之前加u前缀是为了与python2区别,但是Django2.1支持python3,以后的版本将会取消这种用法。django-admin makemessages可以用于生成message文件,compilemessage可以进行编译。

_()或gettext()可以使用占位符,如下:

def my_view(request, m, d):output = _('Today is %(month)s %(day)s.') % {'month': m, 'day': d}return HttpResponse(output)

Comments for translators

如果要向翻译人员提供有关可翻译字符串的提示,可以在字符串前一行添加前缀为translators关键字的注释。生成的.po文件中也会包含这个注释,例如:

def my_view(request):# Translators: This message appears on the home page onlyoutput = gettext("Welcome to my site.")#-----.po文件中-------------#
#. Translators: This message appears on the home page only
# path/to/python/file.py:123
msgid "Welcome to my site."
msgstr ""

在模板语言中,也可以使用commet进行多行标记,如下

{% comment %}Translators: View verb{% endcomment %}
{% trans "View" %}{% comment %}Translators: Short intro blurb{% endcomment %}
<p>{% blocktrans %}A multiline translatable literal.{% endblocktrans %}</p>

或者使用{#...#}进行单行标记

{# Translators: Label of a button that triggers search #}
<button type="submit">{% trans "Go" %}</button>{# Translators: This is a text of the base template #}
{% blocktrans %}Ambiguous translatable block of text{% endblocktrans %}

Pluralization

使用函数 django.utils.translation.ngettext() 对信息复数化,例如object是单数,objects是复数,而ngettext函数有三个参数,分别是单数形式的translation string, 复数形式的translation string和对象的个数,如下例子:

from django.http import HttpResponse
from django.utils.translation import ngettextdef hello_world(request, count):page = ngettext('there is %(count)d object','there are %(count)d objects',count) % {'count': count,}return HttpResponse(page)

Contextual markers

上下文标记,是因为有些单词有多个意思,例如英语中“May”,可以是月份的名字也可以是一个动词。 django.utils.translation.pgettext()函数可以实现这个功能,并在.po的文件中增加一个msgctxt来标记,例如:

from django.utils.translation import pgettextmonth = pgettext("month name", "May")

或者也可以使用

from django.db import models
from django.utils.translation import pgettext_lazyclass MyThing(models.Model):name = models.CharField(help_text=pgettext_lazy('help text for MyThing model', 'This is the help text'))

则在 .po的文件中表示为:

msgctxt "month name"
msgid "May"
msgstr ""

Lazy translation

Lazy是python设计模式中的一个概念,可以让实际对象的生成在使用时才生成,这样做的好处是可以节约内存。 django.utils.translation中有lazy前缀的函数是其lazy版本,这个函数存储了字符串的惰性相关,而不是实际的翻译。当字符串被使用时,例如模板被渲染时,翻译的行为才执行。当被调用的这些函数需要在模块加载时执行,这些函数的使用是非常重要的。

 这是在定义模型、窗体和模型窗体时很容易发生的事情,因为Django实现了这些,使得它们的字段实际上是类级属性。因此,请确保在以下情况下使用惰性翻译:

1)在Model fileds、关系(如 ForeignKeyManyToManyField 和 OneToOneField)中出现verbose_name 和 help_text等选项值时:

from django.db import models
from django.utils.translation import gettext_lazy as _class MyThing(models.Model):name = models.CharField(help_text=_('This is the help text'))

在关系中使用verbose_name(可读性名称)选项时的例子:

class MyThing(models.Model):kind = models.ForeignKey(ThingKind,on_delete=models.CASCADE,related_name='kinds',verbose_name=_('kind'),)

2)Model verbose names values

from django.db import models
from django.utils.translation import gettext_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 = _('my things')

其中Meta是Django的内部类,它用于定义一些Django模型类的行为特性,详细可参见https://www.cnblogs.com/flash55/p/6265405.html

3)模型中的short_description属性值

对于模型方法,可以向django和具有short_description属性的管理站点提供翻译:

from django.db import models
from django.utils.translation import gettext_lazy as _class MyThing(models.Model):kind = models.ForeignKey(ThingKind,on_delete=models.CASCADE,related_name='kinds',verbose_name=_('kind'),)def is_mouse(self):return self.kind.type == MOUSE_TYPEis_mouse.short_description = _('Is it a mouse?')

注意:

gettext_lazy()调用的结果可以在其他任何位置的django代码中使用字符串(str对象),但它可能不适用于任意的python代码。例如,由于requests库不处理gettext_lazy对象,因此以下内容无法工作:

body = gettext_lazy("I \u2764 Django")  # (unicode :heart:)
requests.post('https://example.com/send', data={'body': body})

通过将gettext_lazy()对象强制转换为文本字符串,然后将其传递给非django代码,可以避免此类问题:

requests.post('https://example.com/send', data={'body': str(body)})

Django2.1 translation详解相关推荐

  1. OSI(open system internet)七层模型介绍以及NAT(Network Address Translation)技术详解

    文章目录 1- OSI七层模型介绍 2- 物理层 (1)作用 (2)常见协议 3- 数据链路层 (1)作用 (2)常见协议 [1]ARP协议(地址解析) [2]RARP协议(逆地址解析) [3]PPP ...

  2. ORB-SLAM2代码/流程详解

    ORB-SLAM2代码详解 文章目录 ORB-SLAM2代码详解 1. ORB-SLAM2代码详解01_ORB-SLAM2代码运行流程 1 运行官方Demo 1.2. 阅读代码之前你应该知道的事情 1 ...

  3. 以SIGSEGV为例详解信号处理(与栈回溯)

    以SIGSEGV为例详解信号处理(与栈回溯) 信号是内核提供的向用户态进程发送信息的机制, 常见的有使用SIGUSR1唤醒用户进程执行子程序或发生段错误时使用SIGSEGV保存用户错误现场. 本文以S ...

  4. LVS原理详解(3种工作方式8种调度算法)--老男孩

    一.LVS原理详解(4种工作方式8种调度算法) 集群简介 集群就是一组独立的计算机,协同工作,对外提供服务.对客户端来说像是一台服务器提供服务. LVS在企业架构中的位置: 以上的架构只是众多企业里面 ...

  5. LVS详解及基于LVS实现web服务器负载均衡

    前言 LVS(Linux Virtual Server)Linux虚拟服务器,是一个虚拟的服务器集群系统.本项目在1998年5月由章文嵩博士成立,是中国国内最早出现的自由软件项目之一.通过LVS提供的 ...

  6. php各种编码集详解和在什么情况下进行使用 [php 字符集 显示]

    http://blog.cnsunrun.com/member/blog/blog_info/30/84 ----------------------------------------------- ...

  7. 图文并茂详解iptables 防火墙工作原理及知识点

    防火墙相关概念 iptables相关概念以及工作原理 iptables中四表五链的原理及规则 iptables中的基本命令详解 ------------------防火墙相关概念----------- ...

  8. 一次请求到php都经过了哪些步骤,PHP高级之一次请求处理过程或生命周期详解

    简介先看看下面这个过程: 我们从未手动开启过PHP的相关进程,它是随着Apache的启动而运行的:PHP通过mod_php5.so模块和Apache相连(具体说来是SAPI,即服务器应用程序编程接口) ...

  9. 【NLP】四万字全面详解 | 深度学习中的注意力机制(二)

    NewBeeNLP原创出品 公众号专栏作者@蘑菇先生 知乎 | 蘑菇先生学习记  前情提要:四万字全面详解 | 深度学习中的注意力机制(一) 目前深度学习中热点之一就是注意力机制(Attention ...

最新文章

  1. IIR+全通滤波器级联实现系统零相位相移_matlab仿真
  2. IDEA中多行注释及取消注释的快捷键分享
  3. cfile read 最大读取限制_pandas读取表格后的常用数据处理操作
  4. Sprint2团队贡献分
  5. android图片压缩上传系列-基础篇
  6. 先天性脑部发育异常_儿童脑发育不良的3大“诱因”,若孩子出现这5种异常,要警惕...
  7. 视觉SLAM——ORB特征
  8. 操作系统编写之代码解释
  9. Tapestry 教程(四)探索项目结构
  10. iOS 开发经验 - 转载
  11. c语言模拟uart协议的收发
  12. 吴忌寒联姻500.COM的背后秘密
  13. jquery源码_详细中文注释
  14. 索尼电视未能找到服务器是怎么回事,索尼电视进行网络设置或尝试访问互联网内容时出现错误...
  15. python爬取百思不得姐视频代码
  16. 爱普生Epson WorkForce WF-7725 一体机驱动
  17. 金九银十的你准备好了吗?Python 100道基础面试题先收藏!【附答案】
  18. android 三星打印机,安卓逆袭传统 三星X4300LX复合机首测
  19. LOB大字段空间整理
  20. ios6/io7 画面适配

热门文章

  1. jdk源码分析,Java视频全套
  2. 什么是微服务架构?什么是服务注册与服务发现?
  3. python中计时工具timeit模块的基本用法
  4. 内部管理类软件基础架构思想(思路图解 + 配套免费视频)
  5. 如何理解服务注册和服务发现
  6. oracle 创建表空间
  7. Cypress代理铁电存储器FM25V10-GTR中文资料
  8. 计网实验:单臂路由实现VLAN之间的通信详解(Cisco Packet Tracer)
  9. 特征提取——灰度共生矩阵(GLCM)
  10. 就在本周末!北美最牛X的餐饮大咖都找齐了,值得你来朝圣这一次