
本文介绍如何结合 django 内置 i18n 机制,在前端 javascript 对象中动态翻译按钮文案,无需修改原始 html 结构,兼容现有 vue/react 或纯 js 项目。
在 Django 构建多语言网站时,模板中的 {% trans %} 标签可轻松处理服务端渲染内容的翻译,但前端 JavaScript 对象(如按钮配置、状态提示等)默认无法被 Django 模板引擎解析。针对这类场景,推荐采用「服务端预注入翻译字符串」的方式——即在 HTML 模板中提前将翻译后的文本以变量形式注入全局作用域或内联
✅ 正确做法:服务端生成翻译后传入前端
首先,在对应 Django 模板(如 base.html 或页面模板)的
或 底部添加:然后在你的 JavaScript 配置文件(或内联脚本)中直接使用:
const configButton = {
purchases: {
attr: 'data-out',
default: {
class: 'button_style_blue',
text: '' + window.translations.addToList
},
active: {
class: 'button_style_light-blue-outline',
text: '' + window.translations.recipeInList
}
}
};⚠️ 注意事项:确保已启用 Django 国际化中间件(django.middleware.locale.LocaleMiddleware)并正确配置 LANGUAGES 和 LOCALE_PATHS;所有 trans 模板标签中的字符串需被 makemessages 扫描到(建议统一用英文书写,避免硬编码中文);若使用 gettext Python 函数(如原答案所示),仅适用于服务端 Python 代码,不能直接在浏览器 JS 中调用——该方式在原答案中存在概念混淆,实际不可行;必须通过模板渲染或 API 接口传递翻译结果。
? 进阶建议:支持动态语言切换
如需在不刷新页面的前提下切换语言,可配合 Django REST Framework 提供一个翻译接口:
立即学习“Java免费学习笔记(深入)”;
# views.py
from django.utils.translation import gettext as _
from django.http import JsonResponse
def get_translations(request):
return JsonResponse({
'addToList': _('Add to purchase list'),
'recipeInList': _('Recipe in purchase list'),
})前端通过 fetch() 获取实时翻译,并更新 configButton,实现无感语言切换。
总之,Django 的国际化能力强大,但 JavaScript 层需遵循「服务端提供翻译 → 前端消费」的原则。避免尝试在浏览器中直接调用 Python 的 _() 函数,而应善用模板变量注入或轻量 API,确保翻译准确、可维护且符合 Django 最佳实践。










