【django 学习笔记】18-国际化

来源:互联网 发布:淘宝nba旗舰店真假 编辑:程序博客网 时间:2024/05/22 05:10

Django的国际化挂接是默认开启的,这可能会给Django的运行增加一点点开销。 如果您不需要国际化支

,那么您可以在您的设置文件中设置 USE_I18N = False 。 如果 USE_I18N 被设为 False ,那么Django

进行一些优化,而不加载国际化支持机制。

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

1. 第一步:在你的Python代码和模板中嵌入待翻译的字符串。

2. 第二步:把那些字符串翻译成你要支持的语言。

3. 第三步:在你的Django settings文件中激活本地中间件。

如何指定待翻译字符串

标准 翻译

在下面这个例子中,文本 “Welcome to my site” 被标记为待翻译字符串:

from django.utils.translation import ugettext as _

def my_view(request):

output = _(“Welcome to my site.”)

return HttpResponse(output)

显然,你也可以不使用别名来编码。 下面这个例子和前面两个例子相同:

from django.utils.translation import ugettext

def my_view(request):

output = ugettext(“Welcome to my site.”)

return HttpResponse(output)

标 记字 符串为不 操作

使用 django.utils.translation.gettext_lazy() 函数,使得其中的值只有在访问时才会被翻译,而不是在gettext_lazy() 被调用时翻译。

惰 性 翻译

使用 django.utils.translation.gettext_lazy() 函数,使得其中的值只有在访问时才会被翻译,而不是在gettext_lazy() 被调用时翻译。

复数的处理

使用django.utils.translation.ungettext()来指定以复数形式表示的消息。

模板代码

为了使得模板访问到标签,需要将{% load i18n %} 放在模板最前面。

这个{% trans %}模板标记翻译一个常量字符串 (括以单或双引号) 或 可变内容:

<title>{% trans “This is the title.” %}</title>

<title>{% trans myvar %}</title>

与惰性翻译对象一道工作

拼接字符串: string_concat()

allow_lazy() 修饰符

创建语言文件

信息文件是包含了某一语言翻译字符串和对这些字符串的翻译的一个文本文件。 信息文件以 .po 为后缀名。

django-admin.py makemessages -l de

这段脚本应该在三处之一运行:

  • Django项目根目录。
  • Django应用的根目录。
  • django 根目录(不是Subversion检出目录,而是通过 $PYTHONPATH 链接或位于该路径的某处)。这仅和你为Django自己创建一个翻译时有关。

作为默认, django-admin.py makemessages 检测每一个有 .html 扩展名的文件。 以备你要重载缺省值,使用 –extension -e 选项指定文件扩展名来检测。

django-admin.py makemessages -l de -e txt

用逗号和()使用-e–extension来分隔多项扩展名:

django-admin.py makemessages -l de -e html,txt -e xml

当创建JavaScript翻译目录时,你需要使用特殊的Django:not -e js

.po 文件格式很直观。 每个 .po 文件包含一小部分的元数据,比如翻译维护人员的联系信息,而文件的大部分内容是简单的翻译字符串和对应语言翻译结果的映射关系的列表。

若要对新创建的翻译字符串校验所有的源代码和模板,并且更新所有语言的信息文件,可以运行以下命令:

django-admin.py makemessages -a

编译信息文件

这个工具作用于所有有效的 .po 文件,创建优化过的二进制 .mo 文件供 gettext 使用。在你可以运行django-admin.py makemessages 的目录下,运行django-admin.py compilemessages:

django-admin.py compilemessages

就是这样了。 你的翻译成果已经可以使用了。

Django如何处理语言偏好

如果要让每一个使用者各自指定语言偏好,就需要使用 LocaleMiddleware LocaleMiddleware 使得Django 基于请求的数据进行语言选择,从而为每一位用户定制内容。 它为每一个用户定制内容。使用 LocaleMiddleware 需要在 MIDDLEWARE_CLASSES 设置中增加‘django.middleware.locale.LocaleMiddleware’ 。 中间件的顺序是有影响的,最好按照依照以下要求:

  • 保证它是第一批安装的中间件类。
  • 因为 LocalMiddleware 要用到session数据,所以需要放在 SessionMiddleware 之后。
  • 如果你使用CacheMiddleware,LocaleMiddleware 放在它后面。

LocaleMiddleware 按照如下算法确定用户的语言:

  1. 首先,在当前用户的 session 的中查找django_language;
  2. 如未找到,它会找寻一个cookie
  3. 还找不到的话,它会在 HTTP 请求头部里查找Accept-Language , 该头部是你的浏览器发送的,并且按优
  4. 先顺序告诉服务器你的语言偏好。 Django会尝试头部中的每一个语种直到它发现一个可用的翻译。
  5. 以上都失败了的话, 就使用全局的 LANGUAGE_CODE 设定值。

在你自己的项目中使用翻译

set_language 重定向视图

方便起见,Django自带了一个 django.views.i18n.set_language 视图,作用是设置用户语言偏好并重定向返回到前一页面。

URLconf中加入下面这行代码来激活这个视图:

(r’^i18n/’, include(‘django.conf.urls.i18n’)),

翻译与JavaScript

使用JavaScript翻译目录

创建JavaScript翻译目录

django-admin.py makemessages -d djangojs -l de