分为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
2
3{% trans "This is the title" as the_title %}
<title>{{ the_title }}</title>
<meta name="description" content="{{ the_title }}">
4.如果翻译的内容有django模板输出的变量,就需要用blocktrans
和endblocktrans
1
2
3
4
5
6
7
8
9
10
11
12
13
14# 普通用法
{% blocktrans %}This string will have {{ value }} inside.{% endblocktrans %}
# 增加过滤器
{% blocktrans with amount=article.price %}
That will cost $ {{ amount }}.
{% endblocktrans %}
{% blocktrans with myvar=value|filter %}
This will have {{ myvar }} inside.
{% endblocktrans %}
# 多个过滤器
{% blocktrans with book_t=book|title author_t=author|title %}
This is {{ book_t }} by {{ author_t }}
{% endblocktrans %}
# 注意:其他bolck tags (例如 {% for %} or {% if %}) 不允许在 blocktrans tag内部.
生成翻译文件,并且翻译
1.执行如下命令生成翻译文件1
2python manage.py makemessages -l en
# en 指的是English,其他以此类推
接下来看到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
2
3from django.views.i18n import javascript_catalog
js_info_dict = { 'packages': ('your.app.package',),}
urlpatterns += [ url(r'^jsi18n/$', javascript_catalog, js_info_dict, name='javascript-catalog'),]
在模板中先于需要汉化js引用如下js1
<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
本文总阅读量次