17370845950

如何在 Django 项目中实现前端按钮文本的国际化翻译

本文介绍如何结合 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.Locale

    Middleware', ...] 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 支持),又能保持前端逻辑简洁可控,真正实现前后端一体化的国际化体验。