菜鸟网络工程师的成长笔记——第4天(2016.08.21)

菜鸟网络工程师的成长笔记——第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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值