最近在公司终于开始做web开发了,本以为会是简单的首页之类的小规模项目,结果上来就是一个处理大数据分析的项目,一个关于油品分析的系统,不过我接到的第一个任务是做这个网站的国际化处理,虽然项目还没有上线,还差的很多,但是国际化这个东西使用的是Django自带的来处理的,所以在一边写项目的时候就要写好国际化的代码,所以我现在就开始处理我的国际化了.

大家可以在Django Doctment上看官方的说明,我在这里就不复制官方文档了,django框架带有完善的I18N和L10N支持,其实现是基于GNU gettext的。最近看着文档研究了一下,在这里概要总结一下django国际化的处理流程。

经典用法是把ugettext_lazy导为_使用,该函数标记要翻译的符号,并在要输出该符号的时候进行翻译,返回unicode对象:

 from django.utils.translation import ugettext as _
from django.utils.translation import ugettext_lazy label=ugettext_lazy(u"日期")
......
opt = {"data": [], "name": _(u'销售额({first},{last})')

需要输出label和opt的地方就会自动转成对应的国际化语言了,现在是在代码里面改好了,那么接下来该怎么使用呢?

紧接着在对应app目录创建locale目录,并按此格式<language>/LC_MESSAGES/创建好欲支持的语言目录,转到app目录下执行django-admin.py makemessages --all 命令, 把所有标记的翻译符号导出为po文件,打开各个<language>/LC_MESSAGES/django.po文件,把符号翻译为对应的本地言语,再执行django-admin.py compilemessages把po文件编译为mo文件,这两个命令一定要在locale的当前目录执行。

那么接下来,就要在settings文件中配置关于国际化的设置了,我们需要在settings文件中这样配置:

 USE_I18N = True

 USE_L10N = True

 LANGUAGE_CODE = 'zh-cn'

 TIME_ZONE = 'Asia/Shanghai'

 LANGUAGES = (
('en', ugettext_lazy(u"英文")),
('zh-cn',ugettext_lazy(u"中文")),
) #是否自动判断Accept-Language头转换语言
LOCALEURL_USE_ACCEPT_LANGUAGE=False #是否显示语言前缀
PREFIX_DEFAULT_LOCALE = True #是否在session中保存用户指定的语言
LOCALEURL_USE_SESSION=True MIDDLEWARE_CLASSES = (
'django.middleware.gzip.GZipMiddleware',
'django.middleware.common.CommonMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.locale.LocaleMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
) TEMPLATE_CONTEXT_PROCESSORS = ("django.contrib.auth.context_processors.auth",
                                  "django.core.context_processors.debug",
                                 "django.core.context_processors.i18n",
                                 "django.core.context_processors.media",
                                 "django.core.context_processors.static",
                                 "django.core.context_processors.tz",
                                 "django.contrib.messages.context_processors.messages")

注意:MIDDLEWARE_CLASSES中要增加'django.middleware.locale.LocaleMiddleware',该中间见要出现在SessionMiddleware和CacheMiddleware后,其他所有中间件之前,而TEMPLATE_CONTEXT_PROCESSORS 中要增加 'django.core.context_processors.i18n'.

当你做完以上这些操作你就可以让你的项目成功的显示多语言了,那接下来呢?你会发现实际上项目中还会有一些是无法翻译过来的,那是为什么呢?因为他们都是通过外部的js来渲染进模板中的,这样的话你再使用上面提到的方法就不行了,那么该怎么办呢?下面我就来介绍如何在外部js中做多语言的翻译.

首先,我们要在urls.py文件中这样配置:

url(r'^jsi18n/(?P<packages>\S+?)/$', 'django.views.i18n.javascript_catalog'), 

然后在需要国际化的模板页中引入:

    <script type="text/javascript" src="/jsi18n/userauth"></script>  

那么,在这个页面中可以用javascript调用gettext方法实现国际化。/userauth是locale文件所在的路径(可以是app路径,此app应该在settings.py的INSTALL_APP中配置好)。接着,在userauth的locale路径下,如/zh_CN路径下新建djangojs.po文件,将msgid和msgstr的对应关系写入。再利用django-admin.py compilemessages即可以在javascript中利用gettext('bug.manage')获得它对应的国际化值。

对于Djangojs.py文件的建立我们采用这样的命令:

django-admin.py makemessage -d djangojs -l en

这样,就会在之前我们生成django.py文件的目录里产生一个djangojs.py文件了,这样就可以直接进行翻译了.而对于js文件中的字符串我们采用什么样的方式呢?

var name = String.format("xxxxxx{0}",gettext('xxx'))

到此为止就基本不会再出现什么问题了,那么Django是按照什么样的顺序来确定应该是使用什么样的语言呢?

1,在用户session里查找django_language key

2,如果不存在session,查找django_language cookie

3,查找http头 Accept-Language

4,以后都未设置,使用settings.LANGUAGE_CODE

决定了使用哪种语言后,按如下找顺序查找mo文件:

1,settings LOCALE_PATHS变量指定的路径

2,每个app目录下的locale目录

3,工程目录下的locale目录

4,最后是django/conf/locale目录

当有重复的mo文件时,mo优先级同查找顺序一致,即先找到的会屏蔽其后边的mo项

OK!!基本上关于Django多语言处理的地方都介绍过了,这样就成功的实现了多语言的处理了~~~

Django分析之国际化处理的更多相关文章

  1. django框架项目 国际化和本地化的实现方法

    转自 https://blog.csdn.net/scissors0707/article/details/79042458 Django国际化 所谓的国际化,是指使用不同语言的用户在访问同一个网站页 ...

  2. Django分析之如何自定义manage命令

    我们都用过Django的manage.py的命令,而manage.py是在我们创建Django项目的时候就自动生成在根目录下的一个命令行工具,它可以执行一些简单的命令,其功能是将Django proj ...

  3. Django分析之使用redis缓存服务器

    时间长没有更新了,这段时间一直忙着一个项目,今天就记录一个现在经常会用到的技术吧. redis相信大家都很熟悉了,和memcached一样是一个高性能的key-value数据库,至于什么是缓存服务器, ...

  4. Django分析之导出为PDF文件

    最近在公司一直忙着做exe安装包,以及为程序添加新功能,好久没有继续来写关于Django的东西了….难得这个周末清闲,来了解了解Django的一些小功能也是极好的了~ 那今天就来看看在Django的视 ...

  5. Django分析之Middleware中间件

    写了几周的脚本,今天终于开始接触web框架了~学习Python的web框架,那么Django就几乎是必修课了,这次的工作是先打打下手,主要的任务是在setting中添加版本号,在渲染静态css,js的 ...

  6. Django 分析(一)Requst、Middleware 和 Response 数据流

    0. 前言 通过 Django 编写 HTTP 接口时,我们需要指定 URL.Model 和 Views 函数(或者指定 RESTBaseView 对象解析参数和编写逻辑) 编写逻辑时的基本思路就是解 ...

  7. Django分析之三级下拉菜单选择省/市/县

    今天遇到了一个一直想做却没有机会去做的功能,今天完成了便记录下来. 那这次是具体是个什么功能呢?其实还是很简单的效果,就是在用户注册的时候可以选择省/市/县,很简单的一个小功能. 那现在就开始了~首先 ...

  8. Django 国际化和本地化

    所谓的国际化,是指使用不同语言的用户在访问同一个网站页面时能够看到符合其自身语言的文本页面. 国际化的基本原理是: 浏览器通过LANGUAGE_CODE在HTTP请求头中告诉网站后台服务器用户所需要的 ...

  9. Django国际化和本地化

    把django的这篇文档看了一遍,基本弄懂了,讲的也挺详细的 https://docs.djangoproject.com/en/1.6/topics/i18n/ 首先是国际化和本地化概念: 1,国际 ...

随机推荐

  1. CSS选择器优先级总结

    CSS三大特性-- 继承. 优先级和层叠. 继承:即子类元素继承父类的样式; 优先级:是指不同类别样式的权重比较; 层叠:是说当数量相同时,通过层叠(后者覆盖前者)的样式. css选择符分类 首先来看 ...

  2. 大熊君学习html5系列之------History API(SPA单页应用的必备)

    一,开篇分析 Hi,大家好!大熊君又和大家见面了,(*^__^*) 嘻嘻……,这系列文章主要是学习Html5相关的知识点,以学习API知识点为入口,由浅入深的引入实例, 让大家一步一步的体会" ...

  3. hzwer模拟赛 Hzwer的陨石

    题目描述 Description 经过不懈的努力,Hzwer召唤了很多陨石.已知Hzwer的地图上共有n个区域,且一开始的时候第i个陨石掉在了第i个区域.有电力喷射背包的ndsf很自豪,他认为搬陨石很 ...

  4. codevs2800 送外卖

    题目描述 Description 有一个送外卖的,他手上有n份订单,他要把n份东西,分别送达n个不同的客户的手上.n个不同的客户分别在1~n个编号的城市中.送外卖的从0号城市出发,然后n个城市都要走一 ...

  5. UIScrollView的其他属性

    @property(nonatomic) BOOL bounces; 设置UIScrollView是否需要弹簧效果 @property(nonatomic,getter=isScrollEnabled ...

  6. [Network] HTML、XML和JSON学习汇总

    写在前面:楼主也是刚刚接触这方面的知识,之前完全是零基础,后来经朋友推荐了几个不错的博文,看完以后豁然开朗.但是此博文更加偏重于基础知识介绍(其实更深的楼主也还不了解,这方面的大神请绕道),只是分享个 ...

  7. 【转】搞不清FastCgi与php-fpm之间是个什么样的关系?

    我在网上查fastcgi与php-fpm的关系,查了快一周了,基本看了个遍,真是众说纷纭,没一个权威性的定义. 网上有的说,fastcgi是一个协议,php-fpm实现了这个协议: 有的说,php-f ...

  8. Node.js入门学习笔记(一)

    先来个最常见的"Hello World!". 打开你最喜欢的编辑器(我用的是Sublime Text),创建一个helloWorld.js的文件.我们要做的就是向stdout输出& ...

  9. CSS3——transform学习

    CSS动画效果可以使用transform和Animation,前者较简单,先学习前者. transform有几个基本变换,平移.旋转.缩放.扭曲 一.translate平移 有translate2d和 ...

  10. MySQL分库分表的一些技巧

    分表是分散数据库压力的好方法. 分表,最直白的意思,就是将一个表结构分为多个表,然后,可以再同一个库里,也可以放到不同的库. 当然,首先要知道什么情况下,才需要分表.个人觉得单表记录条数达到百万到千万 ...