Skip to content

Django框架笔记-国际化

实现一次国际化真的累死我了,中间的过程就让我非常郁闷,先做一笔记录,给以后做个提醒:

先给复习一个课程:GNU gettext 说简单点就是由于提供一套完整的国际化解决方案,目前绝大部分国际化组件都基于此。

Django本身是完全国际化了的,具体为Python自带的标准模块 gettext。当然了,如果不需要国际化,那还是关掉它可以为Django节省一点开销。

对你的Django应用进行国际化的三个步骤:

  1. 第一步:在你的python代码和模板中嵌入待翻译的字符串。
  2. 第二步:把那些字符串翻译成你要支持的语言。
  3. 第三步:在你的django settings文件中激活做要地区的中间件。

如何做这三步,我后面有相应链接并且是中文的,我呢?只是谈谈中间遇到的一些问题,但是建议你先看完再去读文档,那样就比较不会迷糊:

第一:simplejson和ugettext_lazy冲突

在使用AJAX的时候,JSON是最适合不过的数据传输了,但是由于ugettext_lazy返回的是一个object对象,无法正常的显示数据,你可以使用ugettext实现国际化字符串,要不然你可以这样使用:


u"%s" % ugettext_lazy('操作成功')


第二:生成PO文件

当你的Python、模板、脚本中已经做好编码以后,接下来你只要用工具生成PO文件。而Django已经帮你做了这件事,所以如果你只要通过简单的命令自动帮你生成:

生成出python代码和模板中的字符串命令:django-admin.py makemessages -l zh_CN 其中“zh_CN”是语言类型,你可以改成en、zh_TW等等,这里生成后的文件会存在这么一个目录结构表中

  • $APPPATH/locale/<language>/LC_MESSAGES/django.(po|mo)
  • $PROJECTPATH/locale/<language>/LC_MESSAGES/django.(po|mo)
  • All paths listed in LOCALE_PATHS in your settings file are searched in that order for <language>/LC_MESSAGES/django.(po|mo)
  • $PYTHONPATH/django/conf/locale/<language>/LC_MESSAGES/django.(po|mo)

假设我的项目根目录下建立个locale目录,那么当我执行 django-admin.py makemessages -l zh_CN 自动生成/projectname/locale/zh_CN/LC_MESSAGES/django.(po|mo)。

假设我现在需要增加一下英文版,我只需要django-admin.py makemessages -l en

第三:翻译

有了PO文件,接下来就是翻译。专业一点的话用Poedit(呵呵,非常方便的工具,如果想翻译PO文件建议使用它),否则随便找个编辑器打开它自己改里面的代码,但真的会眼花的,如果你需要翻译量较大的话。

注:Django生成的PO文件使用Poedit保存时会出现一个错误提示,那是因为缺少工程信息,从“类目”》“设置”填写完整的信息后即可。

第四:脚本国际化小插曲

文档中介绍动态生成脚本链接:

<script type="text/javascript" src="{% url django.views.i18n.javascript_catalog %}"></script>
总是出现异常,可以使用
<script type="text/javascript" src="/jsi18n/"></script>
原因不明,是我没有去查。

简化操作

我的项目里面有三种语言:英文、简体中文、繁体中文,所以我做了一个BAT文件,如果点一下自动生成数据:

@ECHO OFF
cd E:\Python\WEB\mood\
cd e:
echo 开始制作Python、HTML的PO文件
django-admin.py makemessages -l zh_CN
django-admin.py makemessages -l zh_TW
django-admin.py makemessages -l en
echo 完成
echo 开始制作JavaScript的PO文件
django-admin.py makemessages -d djangojs -l zh_CN
django-admin.py makemessages -d djangojs -l zh_TW
django-admin.py makemessages -d djangojs -l en
echo 完成
echo 开始编译PO文件
django-admin.py compilemessages
pause

哈哈,很开心的告诉你,你不用担心他的生成会破坏我原有已经翻译好的数据,因为Django已经很智能的帮你处理新数据、删除已经存在PO文件中的数据。

参考资料



相关日志

Categories: 开源, 技术.

Tags: ,

Comment Feed

5 Responses

  1. 我完全看不懂哈,不过还是留下一个脚印吧~~~

  2. 有点小问题不懂特来请教一下。我用django-admin.py makemessages -l zh_CN来生成了翻译成中文的po文件,可是要保存时却出现了这样的错误”duplicate message definition”,我想原因是同样的string在不同页面中出现了,比如好几个HTML页面中都出现了”Login”,所以被视为duplicated了。我不知道如何避免这些重复的message,难道只能手动一个一个删除掉?(似乎用poedit无法删除)那如果下次再用django-admin.py makemessages -l zh_CN是不是又会重新出现,又要一个接一个的手动删除了呢?
    如果您能回答我这个问题将无限感激!谢谢!

    WhiteJasmine莉白No Gravatar2010年12月21日 @ 3:09 下午回复
    • 非常抱歉可能我无法帮到你,当我写完这篇文档后由于工作的关系已经很长一段时间没有接触她了。也许你可以到http://drupal.org/search/apachesolr_multisitesearch/duplicate%20message%20definition这里看看或许可以对你有点帮且。

      • 非常感谢哦,这个问题我自己搞定了,原来是自己鬼马出错了没改正,导致不能完全生成po文件,而只是生成到一半的pot文件~感谢了~

        WhiteJasmine莉白No Gravatar2010年12月23日 @ 12:43 下午回复



Some HTML is OK

or, reply to this post via trackback.

*
To prove you're a person (not a spam script), type the security word shown in the picture. Click on the picture to hear an audio file of the word.
Click to hear an audio file of the anti-spam word

Continuing the Discussion