跳转到内容

Django本地化

来自代码酷
Admin留言 | 贡献2025年5月1日 (四) 01:48的版本 (Page creation by admin bot)

(差异) ←上一版本 | 已核准修订 (差异) | 最后版本 (差异) | 下一版本→ (差异)

Django本地化[编辑 | 编辑源代码]

Django本地化(Localization,简称L10n)是指将Django应用程序适配到不同语言和地区的过程,包括翻译文本、格式化日期、时间和数字等。Django提供了强大的国际化(i18n)和本地化工具,使开发者能够轻松创建多语言网站。

概述[编辑 | 编辑源代码]

本地化不仅涉及语言的翻译,还包括以下方面:

  • 文本翻译:将界面中的字符串转换为目标语言。
  • 日期和时间格式化:根据地区显示不同的日期格式(如`YYYY-MM-DD`或`DD/MM/YYYY`)。
  • 数字和货币格式化:例如小数分隔符(`.`或`,`)和货币符号。
  • 时区处理:根据用户所在时区显示时间。

Django使用GNU gettext工具链管理翻译文件,并通过内置的模板标签和过滤器实现本地化渲染。

配置Django本地化[编辑 | 编辑源代码]

在`settings.py`中启用本地化相关设置:

# 启用国际化与本地化
USE_I18N = True
USE_L10N = True

# 支持的语言列表
LANGUAGES = [
    ('en', 'English'),
    ('es', 'Spanish'),
    ('zh-hans', 'Simplified Chinese'),
]

# 默认语言
LANGUAGE_CODE = 'en'

# 指定本地化文件存放路径
LOCALE_PATHS = [
    os.path.join(BASE_DIR, 'locale'),
]

中间件配置[编辑 | 编辑源代码]

通过中间件根据用户请求自动选择语言:

MIDDLEWARE = [
    ...
    'django.middleware.locale.LocaleMiddleware',
    ...
]

翻译流程[编辑 | 编辑源代码]

Django的翻译流程分为三步:

1. 标记可翻译字符串[编辑 | 编辑源代码]

在Python代码中使用`gettext`或`_`别名标记需翻译的字符串:

from django.utils.translation import gettext as _

def my_view(request):
    output = _("Welcome to our site!")
    return HttpResponse(output)

在模板中使用`{% trans %}`标签:

{% load i18n %}
<h1>{% trans "Hello, world!" %}</h1>

2. 生成翻译文件[编辑 | 编辑源代码]

运行以下命令生成`.po`文件:

django-admin makemessages -l es  # 为西班牙语创建翻译文件

生成的`.po`文件示例:

msgid "Welcome to our site!"
msgstr "¡Bienvenido a nuestro sitio!"

3. 编译翻译文件[编辑 | 编辑源代码]

将`.po`文件编译为机器可读的`.mo`文件:

django-admin compilemessages

本地化格式化[编辑 | 编辑源代码]

Django自动根据用户语言环境格式化日期、数字等。例如在模板中:

{{ value|date }}  {# 输出根据语言环境格式化的日期 #}
{{ value|floatformat }}  {# 本地化数字格式 #}

时区处理[编辑 | 编辑源代码]

启用时区支持(`settings.py`):

USE_TZ = True
TIME_ZONE = 'UTC'  # 默认时区

在模板中转换时区:

{% load tz %}
{% timezone "Europe/Paris" %}
    {{ value }}  {# 显示巴黎时间 #}
{% endtimezone %}

实际案例[编辑 | 编辑源代码]

假设我们需要为一个电商网站实现英语和西班牙语切换:

1. 在视图中提供语言选择:

from django.http import HttpResponseRedirect
from django.utils.translation import activate

def set_language(request, language):
    activate(language)
    request.session[settings.LANGUAGE_SESSION_KEY] = language
    return HttpResponseRedirect(request.META.get('HTTP_REFERER'))

2. 在模板中添加语言切换器:

<form action="{% url 'set_language' %}" method="post">
    {% csrf_token %}
    <select name="language">
        {% get_current_language as LANGUAGE_CODE %}
        {% get_available_languages as LANGUAGES %}
        {% for code, name in LANGUAGES %}
            <option value="{{ code }}" {% if code == LANGUAGE_CODE %}selected{% endif %}>
                {{ name }}
            </option>
        {% endfor %}
    </select>
    <input type="submit" value="Go">
</form>

高级主题[编辑 | 编辑源代码]

复数形式处理[编辑 | 编辑源代码]

使用`ngettext`处理不同数量的文本:

from django.utils.translation import ngettext

count = 5
message = ngettext(
    'There is %(count)d product.',
    'There are %(count)d products.',
    count
) % {'count': count}

对应的`.po`文件条目:

msgid "There is %(count)d product."
msgid_plural "There are %(count)d products."
msgstr[0] "Hay %(count)d producto."
msgstr[1] "Hay %(count)d productos."

本地化URL[编辑 | 编辑源代码]

使用`i18n_patterns`为不同语言创建URL前缀:

from django.conf.urls.i18n import i18n_patterns

urlpatterns = i18n_patterns(
    path('about/', views.about),  # 将生成/en/about/, /es/about/等
)

最佳实践[编辑 | 编辑源代码]

1. 始终使用Django提供的本地化工具,而非硬编码格式 2. 为翻译字符串提供上下文注释(在`.po`文件中使用`#.`注释) 3. 测试所有支持语言的界面布局(某些语言文本可能更长) 4. 定期更新翻译文件,与代码变更保持同步

常见问题[编辑 | 编辑源代码]

Q: 为什么我的翻译没有生效? A: 检查以下事项:

  • 是否运行了`compilemessages`
  • `LOCALE_PATHS`设置是否正确
  • 浏览器是否发送了正确的`Accept-Language`头

Q: 如何强制使用特定语言? A: 在视图中调用`django.utils.translation.activate(language_code)`

总结[编辑 | 编辑源代码]

Django的本地化系统提供了完整的工具链,使多语言网站开发变得简单高效。通过合理配置和遵循最佳实践,开发者可以轻松创建适应全球用户的应用程序。