Django国际化的实现

Django国际化依赖于GNU gettext工具集,所以在实现国际化之前需要先装gettext.

sudo apt-get install gettext

可以通过在python交互模式下测试一下有没有安装成功

import django
from django.utils.translation import ugettext

Django实现翻译需要在python代码和模板中添加钩子(翻译字符串)如:

  • python代码中: ugettext(“test”)
  • django模板中: {% trans “test” %}

当然,Django国际化不仅仅这么简单,还有ungettext, gettext_lazy, blocktrans等等,这里只是介绍实现国际化需要的操作.

创建一个项目

执行命令

django-admin.py startproject translate

因为我的django版本是1.5的,所以项目结构是这样的:

--translate
    --translate
        --__init__.py
        --wsgi.py
        --settings.py
        --urls.py   
    --manage.py

如果版本在1.4以下,manage.py应该在translate内部,现在比较高的版本中translate包下应该还有migrate,admin.py等文件或文件夹.不过不影响.

Django国际化的配置需要在settings文件中添加以下几个东西:
     USE_I18N = True
在middleware中添加
     'django.middleware.locale.LocaleMiddleware'

当然,这个middleware不是随便添加的,需要添加在SessionMiddleware之后,CommonMiddleware之前,如果使用的CacheMiddleware则放在CacheMiddleware之后.

创建一个APP
     >> python manage.py startapp internation
或者使用
     >> django-admin.py startapp internation
然后在settings的app中添加internation
创建view
     >> cd internation
创建view函数
     from django.utils.translation import ugettext as _
     from django.shortcuts import render_to_respoonse
     def test_trans(request):
              return render_to_response("hello.html", {"hi": _("hi")})
配置url

在urls.py中添加

from internation.views import test_trans
url(r'^hello/$', test_trans),
在internation中添加templates, 创建hello.html
>> mkdir templates
>> touch hello.html
记住要在hello.html中添加{%  load i18n %}(写在最开头)
然后编写简单代码
{% load i18n %}
<!DOCTYPE html>
<html>
 <head>
  <title>welcome</title>
 </head>
 <body>
  <span>{{ hi }}</span>
 </body>
</html>
生成翻译文件

 在app下创建locale文件夹,因为在运行时,Django构建一个内存中的文字-翻译目录,其搜索加载编译后的.mo文件的顺序是:

  • 优先搜索settings文件中LOCALE_PATHS配置的路径
  • 其次搜索各个app下有没有locale
  • 最后,django/conf/locale中提供的Django提供的基本翻译用作后备

其实,locale因为主要作用于整个项目,而不是某个app,所以推荐创建在最外面,和manage.py在同一个根目录下
然后在settings.py中添加:

import os
PROJECT_ROOT = os.path.abspath(os.path.dirname(__file__))
LOCALE_PATHS = (
  os.path.join(PROJECT_ROOT, 'locale/'),
)

接着使用命令:
 python manage.py makemessages -l en_US
 python manage.py makemessages -l zh_CN

此时locale目录结构应该是:
 –locale
  –en_US
   –LC_MESSAGES
   –django.po
  –zh_CN
   –LC_MESSAGES
   –django.po
编辑en_US下的django.po

msgid "hi"
msgstr "hello"

zh_CN下的django.po

msgid "hi"
msgstr "你好"

调用命令python manage.py compilemessages将会生成对应的django.mo文件。
因为我把LOCALE_PAHTS设置成与settings.py在同一目录下的缘故,需要将编译好的locale移到translation中。

测试运行

执行命令

python manage.py runserver 8000

打开浏览器输入:
 http://127.0.0.1:8000/hello
即可看到"你好"或者"hello",主要看浏览器的当前语言设置,可以在设置中更改当前语言。

更高级的使用方法

很多网站上都提供按钮来切换语言,一般都是中英文切换,这里就用最简单的按钮切换中英文,只需要在之前的代码上稍作修改。

  • 首先需要在settings.py中添加

    LANGUAGES = (
        ('en', 'English'),
        ('zh-CN', 'Chinese'),
    )

    表示两种语言切换。

  • 然后在urls.py中添加

     (r'^i18n/', include('django.conf.urls.i18n')),
  • 接着在hello.html修改为
<body>
  <form action="/i18n/setlang/" method="post" id="myform">
    <input type="hidden" name="next" value="{{ to_url }}" />
    {% for language in LANGUAGES %}
    {% ifnotequal LANGUAGE_CODE language.0 %}
     <input type="hidden" name="language" value="{{ language.0 }}"/>
    {% endifnotequal %}
   {% endfor %}
 </form>
 <span>{{ hi }}</span><br />
 <span>{% trans "hi" %}</span><br />
 <a href="#" onclick="submit()">translate</a><br />
</body>
<script type="text/javascript">
 function submit() {
     document.getElementById("myform").submit();
  }
</script>
  • 然后把views中返回值增加一下
return render_to_response("hello.html", {"hi": _("hi"), LANGUAGES: settings.LANGUAGES, LANGUAGE_CODE: request.LANGUAGE_CODE})

最后进行测试,重启服务器,打开浏览器,点击translate就可以切换中英文了.

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值