一、为什么国际化部署是个麻烦事

当你开发了一个Django网站,用户可能来自世界各地。这时候就会遇到两个头疼的问题:

  1. 用户看到的时间总是和本地时间对不上
  2. 界面上显示的货币/日期格式不符合当地习惯

比如巴西用户访问时,看到的价格显示成"$9.99"会觉得很奇怪,他们更习惯"R$9,99"这种格式。这就是为什么我们需要做国际化(i18n)和本地化(l10n)。

二、搞定时区问题的正确姿势

2.1 配置时区基础设置

在settings.py中必须设置这两个参数:

# Django项目技术栈示例
TIME_ZONE = 'Asia/Shanghai'  # 默认时区
USE_TZ = True  # 启用时区支持

注意

  • 服务器时间建议统一使用UTC
  • 显示给用户的时间通过模板标签转换

2.2 动态时区处理实战

# 中间件示例(放在middleware.py)
from django.utils import timezone

class TimezoneMiddleware:
    def __init__(self, get_response):
        self.get_response = get_response
    
    def __call__(self, request):
        if hasattr(request.user, 'timezone'):
            timezone.activate(request.user.timezone)
        else:
            timezone.deactivate()
        return self.get_response(request)

使用场景
当用户登录后,根据用户资料中的时区设置自动切换显示时间

三、让界面说用户的语言

3.1 基础翻译配置

  1. 先在settings.py启用i18n:
LANGUAGE_CODE = 'zh-hans'  # 默认中文
USE_I18N = True
LOCALE_PATHS = [BASE_DIR / 'locale']  # 翻译文件目录
  1. 在模板中使用翻译标签:
<!-- 模板示例 -->
{% load i18n %}
<h1>{% trans "Welcome Message" %}</h1>
<p>{% blocktrans %}Today is {{ date }}{% endblocktrans %}</p>

3.2 生成翻译文件完整流程

# 生成待翻译文件
django-admin makemessages -l es -l fr

# 编译翻译文件
django-admin compilemessages

注意事项

  • 翻译文件(.po)需要用Poedit等工具编辑
  • 复数形式需要特殊处理(比如英语中apple/apples)

四、高级本地化技巧

4.1 数字和货币格式化

# 视图函数示例
from django.utils.formats import number_format

def product_detail(request):
    price = 1234.5
    # 根据当前语言环境格式化
    localized_price = number_format(price, use_l10n=True)
    return render(request, 'detail.html', {'price': localized_price})

4.2 日期格式本地化

# 在模板中自动转换
{{ value | date:"SHORT_DATE_FORMAT" }}

# 或者在Python代码中
from django.utils.formats import date_format
date_format(datetime.now(), "DATE_FORMAT")

五、避坑指南

  1. 时区陷阱

    • 数据库存储永远用UTC
    • 不要在代码里写死datetime.now()
  2. 翻译常见问题

    • 长句子拆分翻译会导致语法错误
    • 变量插值位置不同语言可能不同
  3. 性能优化

    • 使用缓存存储翻译结果
    • 异步生成翻译文件

六、完整方案实施步骤

  1. 先确定需要支持的语言列表
  2. 数据库字段设计考虑多语言存储
  3. 开发阶段就使用i18n标签
  4. 测试阶段用不同时区验证
# 完整配置示例
# settings.py
LANGUAGES = [
    ('en', 'English'),
    ('es', 'Spanish'),
    ('zh-hans', '简体中文'),
]

MIDDLEWARE += [
    'django.middleware.locale.LocaleMiddleware',
    'myapp.middleware.TimezoneMiddleware'
]

七、总结

做好国际化部署后,你的Django项目可以:

  • 自动显示用户当地的时间格式
  • 根据浏览器语言切换界面文字
  • 正确处理货币/数字的本地化显示

虽然前期配置有点繁琐,但一次投入可以服务全球用户,绝对是值得的!