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

发布时间 - 2026-01-21 00:00:00    点击率:

本文介绍如何结合 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 支持),又能保持前端逻辑简洁可控,真正实现前后端一体化的国际化体验。


# javascript  # python  # java  # html  # js  # 前端  # json  # go  # 编码  # 后端  # 多语言  # django 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: 高端云建站费用究竟需要多少预算?  b2c电商网站制作流程,b2c水平综合的电商平台?  北京专业网站制作设计师招聘,北京白云观官方网站?  Laravel怎么配置不同环境的数据库_Laravel本地测试与生产环境动态切换【方法】  详解免费开源的DotNet二维码操作组件ThoughtWorks.QRCode(.NET组件介绍之四)  Claude怎样写约束型提示词_Claude约束提示词写法【教程】  如何制作公司的网站链接,公司想做一个网站,一般需要花多少钱?  微博html5版本怎么弄发语音微博_语音录制入口及时长限制操作【教程】  JS弹性运动实现方法分析  如何用低价快速搭建高质量网站?  laravel怎么在请求结束后执行任务(Terminable Middleware)_laravel Terminable Middleware请求结束任务执行方法  Laravel DB事务怎么使用_Laravel数据库事务回滚操作  Laravel广播系统如何实现实时通信_Laravel Reverb与WebSockets实战教程  Laravel集合Collection怎么用_Laravel集合常用函数详解  如何选择PHP开源工具快速搭建网站?  北京网站制作费用多少,建立一个公司网站的费用.有哪些部分,分别要多少钱?  Laravel中间件如何使用_Laravel自定义中间件实现权限控制  如何在局域网内绑定自建网站域名?  如何选择可靠的免备案建站服务器?  详解vue.js组件化开发实践  香港网站服务器数量如何影响SEO优化效果?  JavaScript如何实现错误处理_try...catch如何捕获异常?  香港服务器网站推广:SEO优化与外贸独立站搭建策略  ,南京靠谱的征婚网站?  Laravel API资源(Resource)怎么用_格式化Laravel API响应的最佳实践  Laravel如何实现RSS订阅源功能_Laravel动态生成网站XML格式订阅内容【教程】  如何在IIS7中新建站点?详细步骤解析  Laravel API路由如何设计_Laravel构建RESTful API的路由最佳实践  百度浏览器ai对话怎么关 百度浏览器ai聊天窗口隐藏  android nfc常用标签读取总结  JS经典正则表达式笔试题汇总  如何用wdcp快速搭建高效网站?  Win10如何卸载预装Edge扩展_Win10卸载Edge扩展教程【方法】  Laravel Eloquent性能优化技巧_Laravel N+1查询问题解决  为什么php本地部署后css不生效_静态资源加载失败修复技巧【技巧】  HTML5建模怎么导出为FBX格式_FBX格式兼容性及导出步骤【指南】  如何快速搭建高效可靠的建站解决方案?  如何打造高效商业网站?建站目的决定转化率  Laravel如何处理跨站请求伪造(CSRF)保护_Laravel表单安全机制与令牌校验  香港服务器建站指南:免备案优势与SEO优化技巧全解析  公司网站制作价格怎么算,公司办个官网需要多少钱?  Laravel怎么生成URL_Laravel路由命名与URL生成函数详解  利用 Google AI 进行 YouTube 视频 SEO 描述优化  韩国服务器如何优化跨境访问实现高效连接?  Laravel如何集成第三方登录_Laravel Socialite实现微信QQ微博登录  Laravel中的withCount方法怎么高效统计关联模型数量  Laravel如何处理CORS跨域请求?(配置示例)  PHP怎么接收前端传的文件路径_处理文件路径参数接收方法【汇总】  Laravel如何优化应用性能?(缓存和优化命令)  Win11怎么开启自动HDR画质_Windows11显示设置HDR选项