把django的这篇文档看了一遍,基本弄懂了,讲的也挺详细的 https://docs.djangoproject.com/en/1.6/topics/i18n/

首先是国际化和本地化概念:

1,国际化

这是程序员做的工作,在代码中,模板中,做好相应的准备

1.1代码中

使用,  ugettext或者ugettext_lazy

from django.utils.translation import ugettext  as _

在代码中对需要进行翻译的字符串,通常是英文,使用这个函数

result.error = _(u'Invalid Captcha')

然后这个字符串就会被翻译为我们需要的语言, 翻译后的结果还是一个普通的字符串,没什么区别

只是在这里, _(u'Invalid Captcha') 已经不是原来的字符串了,这个函数返回了一个对象.  Trans()类对象,具体去看django.utils.translation模块源代码吧

1.2模板中

要注意,代码中翻译的字符串,可能是用来填充模板的,也可能是比如Ajax接口的返回结果.

如果我们要直接翻译模板中的字符串,那么使用django template的这两个tags :  trans 和 blocktrans

比如

<title>{% trans 'This is the title' %}</title>

那blocktrans用于, 混合了字符串和变量的翻译.

[注意]在模板中使用了 trans 或 blocktrans时

要在开头加

{% load i18n %}

不然会报错

2,  本地化

本地化是翻译做的工作,把原语言的目标翻译写出来

那首先我们要使用一个工具,在app的根目录或整个工程的根目录,运行

django-admin.py  makemessages -l zh_CN

会生成如下的一个文件目录

locale/
├── zh_CN
│   └── LC_MESSAGES
│   ├── django.mo
│   └── django.po

zh_CN指简体中文, 每种语言都有自己的目录,在django中,每个语言都有自己的LANGUAGE_CODE

这时候打开django.po, 内容格式如下

#: views.py:169
msgid "Invalid CAPTCHA"
msgstr "" #: templates/login.html: 15
msgid "This is the title"
msgstr ""

把msgstr填上我们的翻译

然后运行另一个命令

django-admin.py  compilemessages

就生成了编译好的django.mo,是个二进制文件,然后就OK了,最终出现的页面就是我们要的中文了

如果我们在代码或模板中增加或删除了相关的国际化代码,需要从新运行

makemessages  和  compilemessages

如果只是改了django.po中的翻译,当然只需 compile 就行了.

重启服务

完成以上之后,需要重启一下django服务

和国际化有关的setting

1,USE_I18N = True/False

有关的代码是这样的,在django.utils.translation的__init__.py中

 class Trans(object);
def __getattr__(self, real_name):
from django.conf import settings
if settings.USE_I18N:
from django.utils.translation import trans_real as trans
else:
from django.utils.translation import trans_null as trans
setattr(self, real_name, getattr(trans, real_name))
return getattr(trans, real_name)

而trans_null其实就没做什么事

2,LANGUAGE_CODE

比如中文是

LANGUAGE_CODE = 'zh_cn'

.po 文件中的 fuzzy str translation

有时候, 用makemessages生成的.po文件中有些msgid会被标记为 fuzzy

比如

#: models.py:35
#, fuzzy
msgid "hdapp_leader"
msgstr "领队"

这是因为对于 "hdapp_leader",  msgmerge工具认为这个和之前的一个msgid很相似,这个翻译可能不靠谱,于是标记fuzzy; msgfmt就会把这个msgid给略过,也就是这个翻译不会生效,当然如果我们确认是对的, 就手动删掉那行fuzzy,重新compilemessages就好.

------------

下一篇

探讨ugettext和ugettext_lazy的区别

blocktrans

最新文章

  1. GitHub Windows客户端无法登录
  2. C算法编程题(三)画表格
  3. LoadRunner 函数之lr_xml_find
  4. Spring 入门知识
  5. MySql unique的实现原理简析
  6. 造轮子之数据库对比工具DataBaseComparer
  7. 使用D3绘制图表(7)--饼状图
  8. asp.net 父窗体获取子窗体的返回值,可用来对父窗体局部更新
  9. 【DWT笔记】傅里叶变换与小波变换
  10. Sending data to USB printer in C#?
  11. js 中对象属性特性2
  12. 现代的新语言--Swift初探
  13. Python读入与写出中文时出现乱码
  14. _.remove的用法
  15. 异常与诊断(74篇,内含许多WinDBG的文章)
  16. 拿来之笔 希望铭记 笔记 出处 http://www.jianshu.com/p/acb8885283dc
  17. C#基础第七天
  18. mysql5.5.28在Linux下的安装
  19. font-size:0的妙用,用于解决inline或者inline-block造成的间隙
  20. Java内存模型概念简单介绍,想深入自行百度

热门文章

  1. Python数据分析必备Anaconda安装、快捷键、包安装
  2. POJ 3254 - Corn Fields - [状压DP水题]
  3. 在python中读写matlab文件
  4. 启用yarn日志聚集功能
  5. hadoop HA架构安装部署(QJM HA)
  6. 开启 NFS 文件系统提升 Vagrant 共享目录的性能
  7. 用PHP编写一个APP的API
  8. 洛谷P1084 疫情控制 [noip2012] 贪心+树论+二分答案 (还有个小bugQAQ
  9. 单调栈&amp;单调队列学习笔记!
  10. [py]python内存管理