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 按 照如下算法确定用户的语言:
- 首先, 在当前用户的 session 的中查找django_language 键;
- 如未找到, 它会找寻一个cookie
- 还找不到的话, 它会在 HTTP 请求头部里查找Accept-Language , 该头部是你 的浏览器发送的, 并且按优
- 先顺序告诉服务器你的语言偏好。 Django 会 尝试头部中的每一个语种直到它发现一个可用的翻译。
- 以上都失败了的话, 就使用全 局的 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