本文介绍如何结合 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
}
}
};MIDDLEWARE = [..., 'django.middleware.locale.LocaleMiddleware', ...] TEMPLATES = [{..., 'OPTIONS': {'context_processors': [..., 'django.template.context_processors.i18n', ...]}, ...}]
python manage.py makemessages -l en -l zh_Hans python manage.py compilemessages
通过该方式,你既能复用 Django 成熟的翻译流程(.po 文件管理、语言切换、语言前缀 URL 支持),又能保持前端逻辑简洁可控,真正实现前后端一体化的国际化体验。