django 开发多语言网站
django的国际化支持非常好也很易用,支持代码、模板和JS的国际化整体解决方法。特别是到了1.2版本加入了对于模板本地的
日期和数字的本地格式化,其国际化支持已经完善。
应用方法
首先需要修改settings.py:
1. TEMPLATE_CONTEXT_PROCESSORS 加入django.core.context_processors.i18n
2. MIDDLEWARE_CLASSES中加入django.middleware.locale.LocaleMiddleware,注意:它要放在SessionMiddleware和CacheMiddleware的后面,其他中间件的前面
3. LANGUAGE_CODE 设置缺省的网站语言,如 en, zh-cn,it, de-at, es, pt-br
4. LANGUAGES设置网站所支持的所有语言,如(('en', u'English'),('zh-cn',u'中文'))
5. USE_I18N 设置为True
代码中的应用:
1. 所有需要国际化支持的源文件要引入函数gettext: from django.utils.translation import ugettext_lazy as _
2. 需要多语言支持的字符串如此例写: name = models.CharField(_('Name')…)
模板中的应用:
1. 所有需要国际化支持的模板文件需要加载: {% load i18n %}
2. 需要多语言支持的字符串如此写:<title>{% trans "This is the title." %}</title>
3. 翻译中间带变量的句子:{% blocktrans %}This string will have {{ value }} inside.{% endblocktrans %}
JS中的应用(这部分看django的文档没搞出来,自己看源码琢磨了一个方法。你也可参考这个文档):
1. 在url.py中加入: (r'^jsi18n/(?P<packages>\S+?)/$', 'django.views.i18n.javascript_catalog'),
这句话告诉页面在加载这个脚本时由服务器上的javascript_catalog函数生成该脚本,具体的方法是通过packages找到locale,进而找到mo文件,然后将其中的所有翻译字符串放入生成脚本中的一个字典变量中,同时该脚本也定义了gettext函数,这样客户端脚本可使用gettext方法直接从字典中取出翻译字符串。
其中packages为你的项目名或者Application名的列表以加号隔开,格式为: testproject+testproject.app1+testproject.app2。这些项目或Application应在INSTALLED_APPS中申明。
2. 引用jsi18n: <script type="text/javascript" src="/jsi18n/testproject+testproject.app1+testproject.app2”></script>
我的项目不大,只在项目目录下有locale目录因此这样写就可以了 <script type="text/javascript" src="/jsi18n/testproject”></script>
如果你的项目较大,可考虑在Application中放locale目录,如例写脚本链接,这样的话不用每次都生成和加载全站的JS翻译字符串,以加快速度。
3. 在JS中使用gettext函数翻译:document.write(gettext('this is to be translated'));
4. 翻译带变量的句子
fmts = ngettext('There is %s object. Remaining: %s', 'There are %s objects. Remaining: %s', 11); s = interpolate(fmts, [11, 20]); // s is 'There are 11 objects. Remaining: 20'
生成po文件和mo文件
这里先补补课,首先是locale目录, 请把locale创建在项目目录或Application目录中,其结构
locale
en
LC_MESSAGES (这个目录下放django.po/mo, djangojs.po/mo)
zh-cn
LC_MESSAGES(这个目录下放django.po/mo, djangojs.po/mo)
django.po/djangojs.po相当于资源文件,它被编译后形成django.mo/djangojs.mo文件,在运行时被读取。
po文件可以使用工具poedit编辑,我个人喜欢使用 mangage.py makemessages –a 让django自动分析源代码和模板文件
生成po,这里要注意两点:
1. 按我的实践,js中的字符串不能自动生成po,需手工生成
2. makemessages 需要调用工具xgettext, Windows没有,可下载晕版的gettext, 要下两个文件gettext-runtime-X.zip 和 gettext-tools-X.zip
X为版本号,注意版本低了会报错“Django internationalization requires GNU gettext 0.15 or newer”)
下来后放在解压在一个目录里,然后把下面的bin目录加到你系统路径中,具体做法如下
#Install gettext
#Download from http://ftp.gnu.org/gnu/gettext/
cd ~/Downloads
tar xzvf gettext-0.18.1.1.tar.gz
cd gettext-0.18.1.1
./configure
make
sudo make install
3. 通过mangage.py makemessages –a自动生成后,你需要做的是编辑po文件,如 zh-cn/LC_MESSAGES/djang.po,把你的
翻译逐个写上去。最后一步编译: mange.py compilemessages
让用户在页面上切换语言
把这个放到urls.py中:(r'^i18n/', include('django.conf.urls.i18n'))
搞个表单提交用户选择的语言,如例
<form action="/i18n/setlang/" method="post"> {% csrf_token %}
<input name="next" type="hidden" value="/next/page/" />
<select name="language"> {% for lang in LANGUAGES %} <option value="{{ lang.0 }}">{{ lang.1 }}</option> {% endfor %} </select> <input type="submit" value="Go" />
</form>
这里涉及一个问题,用户如此选择的语言是否能被记住,下次访问时无需再选?首先需要了解django如何确定用户需要的语言,其判断流程如此:
1. 首先判断Session里是否有键值为django_language的数据,如有则使用。(在用户选择语言时,如果网站支持Session,django把用户的语言偏好记录在Session中,否则记录在cookie里)
2. 检查cookie里是否有键值为settings.LANGUAGE_COOKIE_NAME的设置,如有则使用。
3. 检查浏览器提供的Accpet Language(各个浏览器都有的配置:语言首选项)是否被网站支持(是否有相应的翻译文件),如支持则使用
4. 以上方式都不能确定时,使用settings.LANGUAGE_CODE(网站缺省语言)
注意这样的方式能确保根据用户浏览器设置来为用户自动选定语言,也能保证用户选择语言后当次访问使用所选语言(用户的语言选择保存在Session和一次有效的cookie中)。如果用户浏览器的设置和其选择的语言不一致时,用户下次访问就无法使用本次选择的语言。要解决这个问题,可以接管"/i18n/setlang/"这个URL的处理,把用户选择直接保存在cookie里,而且其生命周期要搞得长一些。如例:
def set_language(request): from django.utils.translation import check_for_language next = request.REQUEST.get('next', None) if not next: next = request.META.get('HTTP_REFERER', None) if not next: next = '/' response = http.HttpResponseRedirect(next) if request.method == 'POST': lang_code = request.POST.get('language', None) if lang_code and check_for_language(lang_code): if hasattr(request, 'session'): request.session['django_language'] = lang_code max_age = 60*60*24*365 expires = datetime.datetime.strftime(datetime.datetime.utcnow() + datetime.timedelta(seconds=max_age), "%a, %d-%b-%Y %H:%M:%S GMT") response.set_cookie(settings.LANGUAGE_COOKIE_NAME, lang_code, max_age, expires) return response
最后,上述url配置改成这样: :(r'^i18n/setlang', 'yourproject.yourapp.views.set_language'),
django 开发多语言网站相关推荐
- Django开发社交类网站必备的11个第三方应用
Django开发社交类网站必备的11个第三方应用 转载自 逐梦人物 Django 的好处就是大而全,不仅内置了 ORM.表单.模板引擎.用户系统等,而且第三方应用的生态也是十分完善,开发中大部分常见的 ...
- 如果网页内容需要支持多语言,你会怎么做?在设计和开发多语言网站时,有哪些问题你必须要考虑?
采用统一编码UTF-8方式编码 1- 应用字符集的选择:所以对提供了多语言版本的网站来说,Unicode字符集应该是最理想的选择.它是一种双字节编码机制的字符集,不管是东方文字还是西方文字,在Unic ...
- Django开发社交类网站必备的10个第三方应用
本文首发于我的博客 追梦人物的博客,欢迎关注. Django 的好处就是大而全,不仅内置了 ORM.表单.模板引擎.用户系统等,而且第三方应用的生态也是十分完善,开发中大部分常见的功能都能找到对应的第 ...
- 有哪些网站是django开发的_网站模板建设和定制开发哪个好,有哪些区别?
网站有哪些作用?很多企业主对于网站建设都没有什么概念,也不知道建设网站有哪些好处,小编告诉大家做好企业的网站不仅可以展示企业的信息,让企业在互联网上有更多的信息推广,而且网站也会在搜索引擎有排名,这样 ...
- 基于Django开发的购物网站,类似于京东商城Django_Store
Django_Store 本项目基于Django1.11.11等来开发一个购物商城Web程序,本项目集成注册,登录,购物,购物车,评论,搜索,第三方qq登录,微信登录,手机号登录,支付宝支付等功能 G ...
- 多语言网站开发 不完全技术分析收录
转自:http://www.cnbruce.com/blog/showlog.asp?cat_id=27&log_id=691 语言是信息传播的主要障碍. 多语言网站,顾名思义就是能够以多种语 ...
- 多语言网站设计需要注意的问题
在设计和开发一个多语言版本的网站前,需要考虑下列因素: 1- 应用字符集的选择 一个定位于不同语言国家的企业网站势必需要提供多种语言版本的产品和销售信息来满足其世界各地使用不同语言的客户和合作伙伴,其 ...
- 多语言网站(如何实现网站的多语言版本?)
近日,公司要做一个多语言的网站,今天在网上收集资料,下面是个人觉得很不错的文章,有兴趣的朋友可以参考下: ----------------------- 多语言网站,顾名思义就是能够以多种语言(而不是 ...
- 网站设计--多语言网站实现方案
多语言网站实现方案 1,静态:就是为每种语言分别准备一套页面文件,要么通过文件后缀名来区分不同语言,要么通过子目录来区分不同语言. 例如对于首页文件index_en.htm提供英语界面,index_g ...
最新文章
- Layout of the output array img is incompatible with cv::Mat (step[ndims-1] !
- ssh项目部署到weblogic注意事项
- 非MFC工程中使用MFC库
- 在asp.net中如何用javascript读取本地Xml中的数据到网页中的文本框?
- RequestDispatcher对象的应用-请求转发
- 如何删除C++容器中的值
- 完美解决:此地址使用了一个通常用于网络浏览以外目的的端口.出于安全原因,Firefox 取消了该请求...
- 搜狗输入法电脑版_年终福利 | 安卓可用的输入法皮肤 搜狗篇 / 近期日程 | iOS智能深色版。...
- HDU2206:IP的计算
- 查询同一张表符合条件的某些数据的id拼接成一个字段返回
- App Ratings iOS
- js-纳税人识别码验证
- 如何快速制作一副地图
- windows10操作-虚拟桌面与关闭时间线
- css颜色和长度简写
- OpenJudge 7624 山区建小学
- 前端React教程第六课 认识栈调和、setState和Fiber架构
- 【基础框架-SSM】Maven_进阶
- 请输入星期几的第一个字母来判断一下是星期几
- Jmeter分布式压测-windows(master控制机)多个linux(slaves负载机)监测服务器资源(cpu、内存等)