菜鸟网络工程师的成长笔记——第4天(2016.08.21)
今天看了中国女排里约夺冠,女排精神的确令国人精神振奋。但所谓女排精神,一方面互帮互助,一方面顽强拼搏坚毅不屈,世界舞台上片刻的辉煌,凝结的是多少背后的汗水,只有她们自己知道,这种精神的确值得我们学习,任何成功都不是轻而易举的。
7.django双语支持
问题类型:后端,django,i18n
解决状态:已解决
问题描述
最近做的网站需要中英双语可以切换,内容大致相同,只是文字上需要做翻译,而且可以让用户进行语言的选择。
问题解决
其实页面大部分内容是相同的,只是文字和部分图片不同。django提供了i18n(internationalization)的解决方案。
i18n提供接口让web开发者在制作网站时将需要翻译的部分标记出来,然后生成翻译文件,在翻译文件中对标记的字符串进行翻译,然后编译生成供django使用的翻译文件即可。下面按步骤记录下过程。
1.添加url
在url文件中添加:
url(r'^i18n/', include('django.conf.urls.i18n')),
这样,发送i18n/开头的Post会送给django的i18n处理。
2. 在settings中更新国际化的相关设置
在settings.py中添加:
USE_I18N = True
ugettext = lambda s: s
LANGUAGES = (
('en-us', ugettext('English')),
('zh-CN', ugettext('Chinese')),
)
3.模板设置
在settings.py里面的TEMPLATES列表里面的OPTIONS里面的context_processors里面添加一条:
'django.template.context_processors.i18n',
4.添加django.middleware.locale.LocaleMiddleware中间件
需要放在
django.contrib.sessions.middleware.SessionMiddleware后面,
django.middleware.common.CommonMiddleware的前面,如下:
MIDDLEWARE = [
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.locale.LocaleMiddleware',
'django.middleware.common.CommonMiddleware',
]
5.同步数据库
i18n需要section数据库表的支持,所以需要同步数据库。
6.添加待翻译标记
待翻译部分可能位于模板中,也可能位于视图函数中,两者标记的方式不同。
试图函数方法如下:
首先引入ugettext:
from django.utils.translation import ugettext as _
然后将待翻译的字符串作为ugettext的参数,比如:
_('Please input correct verification code'))
这样这个字符串在处理好i18n后就可能会被替换成其他语言。
在模板中方式如下:
首先要引入i18n:
{% load i18n %}
然后将待翻译的字符串用{%trans ‘some strings’ %}包裹起来,比如:
{%trans 'please input password' %}
这样在i18n中’please input password就会被替换成其他语言。
7.创建并更新语言文件
先在app中创建一个名为locale的路径,然后执行:
$ django-admin makemessages -l zh_CN
这样就会在locale目录下生成一个zh_CN/LC_MESSAGES/这样的路径里面有个名为django.po的文件,这个文件将我们标记出来的字符串列了出来,我们可以在这里进行翻译。
翻译完成后执行:
$ django-admin compilemessages
生成一个名为django.mo的文件,就是django使用的翻译文件。
做到这一步,就可以根据用户的浏览器语言设置,使用相应的语言。但如果需要用户自己选择他的语言种类,还需要更进一步。
8.提供用户选择语言种类的接口
在模板中提供一个表单:
<form name="testform" id="testform" method='post'>{% csrf_token %}
<select id="language" name="language" onchange="selectdb(this)">
<option value="1">{% trans "Languages" %}</option>
{% for lang in LANGUAGES %}
<option value="{{ lang.0 }}" > {{ lang.1 }}</option>
{% endfor %}
</select>
</form>
<script>
function selectdb(obj) {
str="/i18n/setlang/";
myform = document.getElementById('testform');
myform.method = "POST";
myform.action = str;
myform.submit();
}
</script>
这个表单可以将用户选择的语言种类传给/i18n/setlang/,进行语言选择。
另外,如果需要在试图函数中获得当前用户使用的语言,可以使用如下值:
request.LANGUAGE_CODE