Django如何支持网站多语言切换?

分为models, views和模版(templates)三处的英文转化。

首先修改settings

1.中间件中增加一个django.middleware.locale.LocaleMiddleware的中间件,并且它的顺序要靠前,笔者的是放第二个。

《Django如何支持网站多语言切换?》 settings中间件配置截图

2.增加LANGUAGES和LOCALE_PATHS,并且手动在项目根目录下创建locale文件夹

《Django如何支持网站多语言切换?》 增加LANGUAGES和LOCALE_PATHS

修改template目录下的html文件

1.每一个html前面都要加上 {% load i18n %},当然如果嫌麻烦,可以把它放在已经存在公共页面里面。
2.在需要翻译的地方加上{% trans ‘XXXXX’ %},XXXXX是需要翻译的文本

《Django如何支持网站多语言切换?》 {% trans ‘XXXXX’ %}

3.多次重复翻译的内容可以像设置常量那样

{% trans "This is the title" as the_title %}
<title>{{ the_title }}</title>
<meta name="description" content="{{ the_title }}">

3.如果翻译的内容有django模板输出的变量,例如{{username}}的内容,就需要用{% blocktrans %}和{% endblocktrans%}

#普通用法
{% 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.执行如下命令生成翻译文件

python manage.py makemessages -l en
#en 指的是English,其他以此类推

接下来看到local文件夹下面生成了en/LC_MESSAGES/

《Django如何支持网站多语言切换?》 local/en/LC_MESSAGES/

2.修改django.po文件,对每一个msgid进行翻译,翻译内容填在msgstr中。

《Django如何支持网站多语言切换?》 修改django.po文件

3.然后编译
python manage.py compilemessages -l en

修改url,此url文件
#之前的url
urlpatterns = patterns('',)
#修改后
from django.conf.urls.i18n import i18n_patterns
urlpatterns += i18n_patterns('',)
重启服务并访问查看效果

http://localhost:端口号/en/adminbd/ap_list
http://localhost:8080/zh-hans/adminbd/ap_list

最后来添加切换语言的功能

1.添加切换语言的url:

url(r'^i18n/',include('django.conf.urls.i18n')),

2.页面上添加如下的form表单(必须是POST请求)

《Django如何支持网站多语言切换?》 html

还有JavaScript代码

《Django如何支持网站多语言切换?》 切换语言JavaScript代码

如果涉及到登录的系统,需要记住用户选择的语言,那么就需要存储session,session名为”_language”
request.session['_language']='zh-hans'
views的多语言,具体可以参考官方文档
from django.utils.translation import ugettext as _
#……
MSG={1:'成功',0:'失败'}
context['msg']=_(MSG[1])
return render(request,RESPONSE_URL,context)
关于javascript的国际化

官方文档
在根urls.py 中添加如下代码,your.app.package替换成app名称

from 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'),]

《Django如何支持网站多语言切换?》 配置JavaScript的url

在模板中先于需要汉化js引用如下js

<script type="text/javascript" src="{% url 'javascript-catalog' %}"></script>

1.然后在使用gettext方法标记需要国际化的内容

《Django如何支持网站多语言切换?》 539181.png

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文件,在里面添加翻译

django-admin makemessages -d djangojs -l en

编译还是与上面的命令一样。
重启服务器可以看到效果

着重强调一点,在JavaScript多语言这里遇到个坑,js的翻译不管是中文还是英文都是显示英文翻译。原因是变异的时候应该用 zh_Hans 而不是zh_hans 或者zh_cn等等。
  django-admin.py makemessages -l zh_Hans 

上面图中也是错的

《Django如何支持网站多语言切换?》 93438.png

最后一个坑是多语言国际化的时候渲染模板的方法要用render(request,’xxxxx.html’,{})而不是render_to_response(’xxxx.html’,{})方法

中文文档

作为默认, django-admin.py makemessages
检测每一个有 .html
扩展名的文件。 以备你要重载缺省值,使用 –extension
或 -e
选项指定文件扩展名来检测。

django-admin.py makemessages -l de -e txt```
用逗号和(或)使用-e
或--extension
来分隔多项扩展名:

django-admin.py makemessages -l de -e html,txt -e xml“`
当创建JavaScript翻译目录时,你需要使用特殊的Django域:not -e js

    原文作者:NeXTCDO
    原文地址: https://www.jianshu.com/p/bc3ada1b2ba1
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞