SSE多语言切换需服务端按lang参数动态生成消息,前端关闭旧连接并新建带语言参数的SSE连接。关键点:服务端翻译、前端只展示;避免前端二次翻译、复用连接或依赖localStorage读取语言配置。

SSE 本身不处理语言逻辑,它只负责把服务端生成的文本流推送到前端。多语言消息推送的动态切换,关键在于消息内容由服务端按客户端当前语言生成,而非前端翻译或硬编码。前端只需正确接收并展示,语言切换时重新建立 SSE 连接即可。
前端:按语言参数发起 SSE 连接
每次语言变更(如用户点击“中文/English”),不应复用旧连接,而应关闭当前 EventSource 并新建一个带 lang 参数的连接:
let eventSource = null;
function connectSSE(lang) {
if (eventSource) eventSource.close();
// 带语言标识的 URL,例如 /api/notifications?lang=zh-CN
eventSource = new EventSource(`/api/notifications?lang=${encodeURIComponent(lang)}`);
eventSource.onmessage = (e) => {
const data = JSON.parse(e.data);
renderNotification(data); // 直接渲染,无需前端翻译
};
eventSource.onerror = () => {
console.warn('SSE 连接失败,将自动重连');
};
}
// 切换语言时调用
changeLanguage('en-US'); // → 触发 connectSSE('en-US')后端:根据请求参数动态生成本地化消息
服务端收到 lang 参数后,从对应语言包(如 i18n JSON 文件、数据库字段或服务)中提取文案,再封装为 SSE 格式输出:
-
响应头必须包含:
立即学习“Java免费学习笔记(深入)”;
Content-Type: text/event-stream Cache-Control: no-cache Connection: keep-alive
-
每条消息格式示例(含事件类型和结构化数据):
event: notification data: {"title":"系统通知","body":"您的订单已发货","action":"查看订单"} event: alert data: {"level":"warning","message":"账户将在24小时后过期"}
✅ 关键点:服务端完成翻译,前端只做展示。避免在前端维护多套文案或用 JS 库(如 i18next)二次处理 SSE 数据——这会增加延迟、出错风险,且无法利用服务端上下文(如用户偏好、区域格式、复数规则等)。
支持语言变更的健壮性设计
-
Token 绑定可选但推荐:若需在语言切换后继续接收未读消息,服务端可结合用户 ID + lang 生成唯一流标识(如
uid:123-lang:ja-JP),避免新连接丢失中间事件。 -
Last-Event-ID 恢复支持:前端断开前记录最后
id,重连时通过headers: { 'Last-Event-ID': lastId }(需手动用fetch+ReadableStream替代EventSource)或服务端透传id字段实现断线续推。 -
Nginx / 反向代理注意:禁用缓冲(
proxy_buffering off;+X-Accel-Buffering: no),否则多语言响应可能被缓存或延迟发送。
不要做的常见错误
- ❌ 在前端收到英文消息后,再用 i18n 库转成中文 —— SSE 是流式推送,无法保证顺序和完整性,翻译时机不可控。
- ❌ 复用同一个 SSE 连接,仅靠前端 JS 修改文案 —— 服务端仍按旧语言生成内容,切换无效。
- ❌ 把语言配置存在 localStorage 后让 SSE 接口自行读取 —— 无状态 HTTP 下,服务端无法感知前端存储变化,必须显式传参。
本质上,SSE 多语言切换就是「参数驱动的流重建」:语言变了,连接就换;服务端拿到语言码,就吐对应文案。不复杂但容易忽略参数传递与连接生命周期管理。


















