Django国际化依赖于GNU gettext工具集,所以在实现国际化之前需要先装gettext.
sudo apt-get install gettext
可以通过在python交互模式下测试一下有没有安装成功
import django
from django.utils.translation import ugettext
Django实现翻译需要在python代码和模板中添加钩子(翻译字符串)如:
- python代码中: ugettext(“test”)
- django模板中: {% trans “test” %}
当然,Django国际化不仅仅这么简单,还有ungettext, gettext_lazy, blocktrans等等,这里只是介绍实现国际化需要的操作.
创建一个项目
执行命令
django-admin.py startproject translate
因为我的django版本是1.5的,所以项目结构是这样的:
--translate
--translate
--__init__.py
--wsgi.py
--settings.py
--urls.py
--manage.py
如果版本在1.4以下,manage.py应该在translate内部,现在比较高的版本中translate包下应该还有migrate,admin.py等文件或文件夹.不过不影响.
Django国际化的配置需要在settings文件中添加以下几个东西:
USE_I18N = True
在middleware中添加
'django.middleware.locale.LocaleMiddleware'
当然,这个middleware不是随便添加的,需要添加在SessionMiddleware之后,CommonMiddleware之前,如果使用的CacheMiddleware则放在CacheMiddleware之后.
创建一个APP
>> python manage.py startapp internation
或者使用
>> django-admin.py startapp internation
然后在settings的app中添加internation
创建view
>> cd internation
创建view函数
from django.utils.translation import ugettext as _
from django.shortcuts import render_to_respoonse
def test_trans(request):
return render_to_response("hello.html", {"hi": _("hi")})
配置url
在urls.py中添加
from internation.views import test_trans
url(r'^hello/$', test_trans),
在internation中添加templates, 创建hello.html
>> mkdir templates
>> touch hello.html
记住要在hello.html中添加{% load i18n %}(写在最开头)
然后编写简单代码
{% load i18n %}
<!DOCTYPE html>
<html>
<head>
<title>welcome</title>
</head>
<body>
<span>{{ hi }}</span>
</body>
</html>
生成翻译文件
在app下创建locale文件夹,因为在运行时,Django构建一个内存中的文字-翻译目录,其搜索加载编译后的.mo文件的顺序是:
- 优先搜索settings文件中LOCALE_PATHS配置的路径
- 其次搜索各个app下有没有locale
- 最后,django/conf/locale中提供的Django提供的基本翻译用作后备
其实,locale因为主要作用于整个项目,而不是某个app,所以推荐创建在最外面,和manage.py在同一个根目录下
然后在settings.py中添加:
import os
PROJECT_ROOT = os.path.abspath(os.path.dirname(__file__))
LOCALE_PATHS = (
os.path.join(PROJECT_ROOT, 'locale/'),
)
接着使用命令:
python manage.py makemessages -l en_US
python manage.py makemessages -l zh_CN
此时locale目录结构应该是:
–locale
–en_US
–LC_MESSAGES
–django.po
–zh_CN
–LC_MESSAGES
–django.po
编辑en_US下的django.po
msgid "hi"
msgstr "hello"
zh_CN下的django.po
msgid "hi"
msgstr "你好"
调用命令python manage.py compilemessages
将会生成对应的django.mo文件。
因为我把LOCALE_PAHTS设置成与settings.py在同一目录下的缘故,需要将编译好的locale移到translation中。
测试运行
执行命令
python manage.py runserver 8000
打开浏览器输入:
http://127.0.0.1:8000/hello
即可看到"你好"或者"hello",主要看浏览器的当前语言设置,可以在设置中更改当前语言。
更高级的使用方法
很多网站上都提供按钮来切换语言,一般都是中英文切换,这里就用最简单的按钮切换中英文,只需要在之前的代码上稍作修改。
首先需要在settings.py中添加
LANGUAGES = ( ('en', 'English'), ('zh-CN', 'Chinese'), )
表示两种语言切换。
然后在urls.py中添加
(r'^i18n/', include('django.conf.urls.i18n')),
- 接着在hello.html修改为
<body>
<form action="/i18n/setlang/" method="post" id="myform">
<input type="hidden" name="next" value="{{ to_url }}" />
{% for language in LANGUAGES %}
{% ifnotequal LANGUAGE_CODE language.0 %}
<input type="hidden" name="language" value="{{ language.0 }}"/>
{% endifnotequal %}
{% endfor %}
</form>
<span>{{ hi }}</span><br />
<span>{% trans "hi" %}</span><br />
<a href="#" onclick="submit()">translate</a><br />
</body>
<script type="text/javascript">
function submit() {
document.getElementById("myform").submit();
}
</script>
- 然后把views中返回值增加一下
return render_to_response("hello.html", {"hi": _("hi"), LANGUAGES: settings.LANGUAGES, LANGUAGE_CODE: request.LANGUAGE_CODE})
最后进行测试,重启服务器,打开浏览器,点击translate就可以切换中英文了.