一、为什么国际化部署是个麻烦事
当你开发了一个Django网站,用户可能来自世界各地。这时候就会遇到两个头疼的问题:
- 用户看到的时间总是和本地时间对不上
- 界面上显示的货币/日期格式不符合当地习惯
比如巴西用户访问时,看到的价格显示成"$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 基础翻译配置
- 先在settings.py启用i18n:
LANGUAGE_CODE = 'zh-hans' # 默认中文
USE_I18N = True
LOCALE_PATHS = [BASE_DIR / 'locale'] # 翻译文件目录
- 在模板中使用翻译标签:
<!-- 模板示例 -->
{% 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")
五、避坑指南
时区陷阱:
- 数据库存储永远用UTC
- 不要在代码里写死datetime.now()
翻译常见问题:
- 长句子拆分翻译会导致语法错误
- 变量插值位置不同语言可能不同
性能优化:
- 使用缓存存储翻译结果
- 异步生成翻译文件
六、完整方案实施步骤
- 先确定需要支持的语言列表
- 数据库字段设计考虑多语言存储
- 开发阶段就使用i18n标签
- 测试阶段用不同时区验证
# 完整配置示例
# settings.py
LANGUAGES = [
('en', 'English'),
('es', 'Spanish'),
('zh-hans', '简体中文'),
]
MIDDLEWARE += [
'django.middleware.locale.LocaleMiddleware',
'myapp.middleware.TimezoneMiddleware'
]
七、总结
做好国际化部署后,你的Django项目可以:
- 自动显示用户当地的时间格式
- 根据浏览器语言切换界面文字
- 正确处理货币/数字的本地化显示
虽然前期配置有点繁琐,但一次投入可以服务全球用户,绝对是值得的!
评论