You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何从Flask向外部JavaScript传递变量?

解决Flask外部JS使用本地化翻译的几种方案

下面是几个实用的实现思路,你可以根据自身场景选择:

1. 全局变量注入(最简洁直接)

在引入外部JS的模板HTML中,先将需要的翻译变量挂载到window全局对象上,外部JS直接读取即可:

<!-- 模板HTML中,在引入bundle.js之前添加这段代码 -->
<script>
window.i18n = {
  translate_1: "{{ translate_1 }}",
  translate_2: "{{ translate_2 }}"
  // 把所有需要用到的翻译项都在这里定义
};
</script>
<script src="/static/js/user/bundle.js"></script>

之后在bundle.js里直接调用:

console.log(i18n.translate_1);
// 或者直接写 window.i18n.translate_1

优点:无需额外路由或配置,适合翻译项较少的场景;缺点:若翻译项过多,模板中的代码会显得冗长。

2. 将JS文件作为Flask模板渲染

把你的bundle.js重命名为Jinja2模板格式(比如bundle.js.jinja2),然后在Flask中添加一个专门渲染该JS文件的路由:

# Flask路由代码
@app.route('/static/js/user/bundle.js')
def serve_localized_js():
    # 假设你已有获取当前翻译上下文的方法,比如get_translations()
    translations = get_translations()
    # 渲染JS模板并返回正确的响应类型
    return render_template('js/user/bundle.js.jinja2', **translations), 200, {
        'Content-Type': 'application/javascript'
    }

接着在bundle.js.jinja2里直接使用模板变量:

// bundle.js.jinja2中的代码
const message = "{{ translate_1 }}";
alert(message);

优点:可以直接在JS中沿用模板语法,无需修改原有JS的变量引用逻辑;缺点:需要额外配置路由,同时要注意浏览器缓存问题(可通过给JS URL加版本号或设置缓存策略解决)。

3. AJAX异步拉取翻译字典

如果翻译项数量较多,或者需要支持动态切换语言,可以让外部JS通过AJAX请求获取完整的翻译字典:

# Flask新增API接口返回翻译数据
@app.route('/api/i18n')
def get_i18n_data():
    translations = get_translations()
    return jsonify(translations)

然后在bundle.js初始化时请求该接口:

// bundle.js中的代码
let i18n = {};
// 页面加载时获取翻译数据
fetch('/api/i18n')
  .then(response => response.json())
  .then(data => {
    i18n = data;
    // 现在可以正常使用i18n.translate_1
    console.log(i18n.translate_1);
  });

优点:无需在模板中定义大量变量,适合翻译项多或需要动态更新语言的场景;缺点:需要处理异步逻辑,JS中要注意等待数据加载完成后再使用翻译项。

内容的提问来源于stack exchange,提问作者Mickael

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.27 22:57:17