在开发面向全球用户的应用时,国际化(Internationalization, 简称i18n)和本地化(Localization, 简称l10n)是两个至关重要的概念。Django作为一个功能强大的Python Web框架,内置了对国际化与本地化的全面支持,使得开发者能够轻松地为不同语言和地区的用户定制内容。本章将深入探讨Django中的国际化与本地化机制,包括如何准备项目以支持多语言、翻译文本、处理时间格式、数字格式以及时区等。
国际化(i18n)是指设计和开发软件时,使其能够支持多种语言和文化,而无需修改软件代码本身。这通常涉及将软件中的字符串、日期、时间、货币等可能因地区而异的元素提取出来,通过配置文件或数据库进行管理。
Django通过一系列工具和约定来支持国际化。首先,你需要确保你的Django项目被设置为支持国际化。这通常涉及以下几个步骤:
USE_I18N
和USE_L10N
:在项目的settings.py
文件中,确保USE_I18N = True
和USE_L10N = True
。这两个设置分别启用Django的国际化支持和本地化支持。.po
文件:Django使用gettext工具集来处理翻译。对于每个需要翻译的语言,你都需要在Django项目的locale
目录下创建相应的.po
(Portable Object)文件。这些文件包含了原始字符串及其翻译。{% trans %}
模板标签和gettext
、ugettext
、pgettext
等函数来标记需要翻译的字符串。在Django模板中,你可以使用{% trans "string_to_translate" %}
来标记需要翻译的字符串。例如:
<p>{% trans "Welcome to our website!" %}</p>
对于包含变量的字符串,可以使用{% blocktrans %}
标签:
<p>{% blocktrans %}There are {{ count }} new messages.{% endblocktrans %}</p>
在Python代码中,你可以使用gettext
模块提供的函数来翻译字符串。Django为此提供了一个封装,即django.utils.translation
模块中的gettext
、ugettext
、pgettext
等函数。例如:
from django.utils.translation import gettext as _
def my_view(request):
message = _("Welcome to our website!")
return HttpResponse(message)
Django的本地化支持包括自动根据用户的语言偏好来格式化日期和时间。这通过settings.py
中的TIME_ZONE
和USE_TZ
设置来控制。TIME_ZONE
设置项目的默认时区,而USE_TZ
决定是否启用时区支持。
在模板中,你可以使用{% localize %}
模板标签来确保日期和时间按照当前激活的语言环境进行格式化。例如:
{% load i18n %}
{% localize %}
<p>Today is {{ value|date:"SHORT_DATE_FORMAT" }}.</p>
{% endlocalize %}
对于数字的格式化,Django同样提供了本地化支持。在模板中,你可以使用{% localize off %}
来关闭数字的本地化,但通常情况下,Django会根据当前的语言环境自动格式化数字。
在Django中处理时区时,重要的是要理解USE_TZ
设置的作用。当USE_TZ = True
时,Django会在内部使用UTC时间,并在显示给用户时根据用户的时区进行转换。这要求你的数据库也存储UTC时间,并在需要时进行转换。
你可以通过settings.py
中的TIME_ZONE
设置来指定项目的默认时区,但这通常只用于内部处理,如日志记录等。对于用户,Django会根据用户的会话或请求头中的信息来确定其时区。
.po
文件Django提供了一个makemessages
命令来自动生成.po
文件。在项目根目录下运行以下命令:
django-admin makemessages -l zh_hans
这将为简体中文(zh_hans
)生成一个.po
文件,其中包含所有标记为可翻译的字符串。
.po
文件生成的.po
文件包含了原始字符串和待翻译的字符串。你需要使用文本编辑器或专门的工具(如Poedit)来编辑这些文件,将待翻译的字符串替换为相应的翻译。
.mo
文件完成翻译后,你需要将.po
文件编译成.mo
(Machine Object)文件,这是Django用来查找翻译的文件格式。使用compilemessages
命令来完成这一步:
django-admin compilemessages
在Django中,你可以通过几种方式来激活特定的语言:
Accept-Language
头部自动选择语言,但你也可以在视图中显式设置。{% language %}
模板标签可以在模板的某个部分临时更改语言。对于时区,Django同样提供了灵活的激活方式:
timezone.activate(timezone.get_timezone('Asia/Shanghai'))
来在代码中显式设置时区。makemessages
、compilemessages
等,来简化翻译流程。通过本章的学习,你应该已经掌握了Django框架中国际化与本地化的基本概念和操作方法。无论是为网站添加多语言支持,还是处理不同地区的日期、时间和数字格式,Django都提供了强大的工具和灵活的机制来帮助你实现这些功能。