分为models, views和模版(templates)三处的英文转化。
首先修改settings
1.中间件中增加一个django.middleware.locale.LocaleMiddleware的中间件,并且它的顺序要靠前,笔者的是放第二个。
2.增加LANGUAGES和LOCALE_PATHS,并且手动在项目根目录下创建locale文件夹
修改template目录下的html文件
1.每一个html前面都要加上 load i18n
,当然如果嫌麻烦,可以把它放在已经存在公共页面里面。
2.在需要翻译的地方加上trans ‘XXXXX’
,XXXXX是需要翻译的文本
3.多次重复翻译的内容可以像设置常量那样
1 | {% trans "This is the title" as the_title %} |
4.如果翻译的内容有django模板输出的变量,就需要用blocktrans
和endblocktrans
1 | # 普通用法 |
生成翻译文件,并且翻译
1.执行如下命令生成翻译文件
1 | python manage.py makemessages -l en |
接下来看到local文件夹下面生成了en/LC_MESSAGES/
2.修改django.po文件,对每一个msgid进行翻译,翻译内容填在msgstr中。
3.然后编译
1 | python manage.py compilemessages -l en |
修改url,此url文件
1 | # 之前的url |
重启服务并访问查看效果
http://localhost:端口号/en/adminbd/ap_list
http://localhost:8080/zh-hans/adminbd/ap_list
最后来添加切换语言的功能
1.添加切换语言的url:
1 | url(r'^i18n/',include('django.conf.urls.i18n')), |
2.页面上添加如下的form表单(必须是POST请求)
还有JavaScript代码
如果涉及到登录的系统,需要记住用户选择的语言,那么就需要存储session,session名为”_language”
1 | request.session['_language']='zh-hans' |
views的多语言,具体可以参考官方文档
1 | from django.utils.translation import ugettext as _ |
关于javascript的国际化
官方文档
在根urls.py 中添加如下代码,your.app.package替换成app名称
1 | from django.views.i18n import javascript_catalog |
在模板中先于需要汉化js引用如下js
1 | <script type="text/javascript" src="{% url 'javascript-catalog' %}"></script> |
1.然后在使用gettext方法标记需要国际化的内容
2.涉及到单数复数形式的用 ngettext
var object_count = 1 // or 0, or 2, or 3, …s = ngettext(‘literal for the singular case’, //单数 ‘literal for the plural case’, object_count);//复数
3.涉及到格式化输出内容的用interpolate,与ngettext搭配使用
fmts = ngettext(‘There is %s object. Remaining: %s’, ‘There are %s objects. Remaining: %s’, 11);s = interpolate(fmts, [11, 20]);// s 输出结果为为复数形式 ‘There are 11 objects. Remaining: 20’
还有其他方法
- get_format
- gettext_noop
- pgettext
- npgettext
- pluralidx
最后与makemessages一样,js也需要生产翻译文件,得到djangojs.po文件,在里面添加翻译
1 | django-admin makemessages -d djangojs -l en |
编译还是与上面的命令一样。
重启服务器可以看到效果
着重强调一点,在JavaScript多语言这里遇到个坑,js的翻译不管是中文还是英文都是显示英文翻译。原因是变异的时候应该用 zh_Hans 而不是zh_hans 或者zh_cn等等。
1 | django-admin.py makemessages -l zh_Hans |
上面图中也是错的
最后一个坑是多语言国际化的时候渲染模板的方法要用render(request,’xxxxx.html’,{})而不是render_to_response(’xxxx.html’,{})方法
作为默认, django-admin.py makemessages
检测每一个有 .html
扩展名的文件。 以备你要重载缺省值,使用 –extension或 -e选项指定文件扩展名来检测。
1 | django-admin.py makemessages -l de -e txt |
用逗号和(或)使用-e或–extension来分隔多项扩展名:
1 | django-admin.py makemessages -l de -e html,txt -e xml |
当创建JavaScript翻译目录时,你需要使用特殊的Django域:not -e js
本文总阅读量次