
本文介绍如何结合 django 内置 i18n 系统与前端 javascript 配置,安全、规范地实现按钮等动态文本的多语言支持,重点解决 js 对象中硬编码字符串的翻译问题。
在 Django 多语言项目中,模板(.html)中的文本可通过 {% trans %} 或 gettext 轻松翻译,但前端 JavaScript 中(如按钮配置对象)的字符串无法被 Django 模板引擎直接处理。若将翻译逻辑完全交由前端(如使用 i18next),会增加维护成本并脱离 Django 的统一语言包管理。更推荐的做法是:在后端预处理翻译,并通过 JSON 或内联脚本安全注入到前端上下文。
✅ 推荐方案:服务端翻译 + 前端变量注入
首先,在视图或上下文中完成翻译,利用 Django 的 gettext(别名 _)获取当前激活语言的译文:
# views.py 或 context processor 中
from django.utils.translation import gettext as _
def your_view(request):
context = {
'add_to_list_text': _("Add to purchase list"),
'recipe_in_list_text': _("Recipe in purchase list"),
}
return render(request, 'your_template.html', context)然后在模板中,将翻译后的字符串安全注入到 JavaScript 全局变量或初始化脚本中(注意使用 |json_script 过滤器防止 XSS):
{{ add_to_list_text|json_script:"js-translations" }}
更清晰的做法是统一构造翻译对象并内联输出:
立即学习“前端免费学习笔记(深入)”;
最后,在你的 JS 配置中引用这些已翻译的变量:
const configButton = {
purchases: {
attr: 'data-out',
default: {
class: 'button_style_blue',
text: '' + djangoTranslations.addToPurchaseList
},
active: {
class: 'button_style_light-blue-outline',
text: '' + djangoTranslations.recipeInPurchaseList
}
}
};⚠️ 注意事项
- 切勿在 .js 文件中直接调用 gettext:静态 JS 文件不经过 Django 模板渲染,_() 函数不可用;
- 避免拼接 HTML 与翻译文本:确保 escapejs 过滤器已应用,防止 XSS(如译文中含引号或
-
启用 i18n 中间件与模板支持:确认 settings.py 中已配置:
MIDDLEWARE = [..., 'django.middleware.locale.LocaleMiddleware', ...] TEMPLATES = [{..., 'OPTIONS': {'context_processors': [..., 'django.template.context_processors.i18n', ...]}, ...}] -
运行 makemessages 和 compilemessages:每次新增 _("...") 后需执行:
python manage.py makemessages -l en -l zh_Hans python manage.py compilemessages
通过该方式,你既能复用 Django 成熟的翻译流程(.po 文件管理、语言切换、语言前缀 URL 支持),又能保持前端逻辑简洁可控,真正实现前后端一体化的国际化体验。










