首页 > 其他 > 详细

Django国际化和本地化

时间:2014-02-26 23:49:02      阅读:747      评论:0      收藏:0      [点我收藏+]

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

 

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

 

1,国际化

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

 

1.1代码中

使用,  ugettext或者ugettext_lazy

bubuko.com,布布扣
from django.utils.translation import ugettext  as _
bubuko.com,布布扣

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

bubuko.com,布布扣
result.error = _(uInvalid Captcha)
bubuko.com,布布扣

 

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

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

 

1.2模板中

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

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

 

比如

bubuko.com,布布扣
<title>{% trans This is the title %}</title>
bubuko.com,布布扣

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

 

 

2,  本地化

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

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

bubuko.com,布布扣
django-admin.py  makemessages -l zh_CN
bubuko.com,布布扣

 

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

bubuko.com,布布扣
locale/
├── zh_CN
│   └── LC_MESSAGES
│       ├── django.mo
│       └── django.po
bubuko.com,布布扣

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

 

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

bubuko.com,布布扣
#: views.py:169
msgid "Invalid CAPTCHA"
msgstr ""

#: templates/login.html: 15
msgid "This is the title"
msgstr ""
bubuko.com,布布扣

把msgstr填上我们的翻译

 

然后运行另一个命令

bubuko.com,布布扣
django-admin.py  compilemessages
bubuko.com,布布扣

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

 

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

bubuko.com,布布扣
makemessages  和  compilemessages
bubuko.com,布布扣

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

 

 

和国际化有关的setting

1,USE_I18N = True/False

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

bubuko.com,布布扣
1 class Trans(object);
2      def __getattr__(self, real_name):
3          from django.conf import settings
4          if settings.USE_I18N:
5              from django.utils.translation import trans_real as trans
6          else:
7              from django.utils.translation import trans_null as trans
8          setattr(self, real_name, getattr(trans, real_name))
9          return getattr(trans, real_name)
bubuko.com,布布扣

而trans_null其实就没做什么事 

 

2,LANGUAGE_CODE

比如中文是

LANGUAGE_CODE = ‘zh_cn‘

 

 

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

下一篇

探讨ugettext和ugettext_lazy的区别

blocktrans

Django国际化和本地化,布布扣,bubuko.com

Django国际化和本地化

原文:http://www.cnblogs.com/livingintruth/p/3568557.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!