超实用指南:xyflow全栈国际化(i18n)方案——从节点标签到全局提示
你是否曾为多语言环境下的流程图应用头疼?客户反馈中文界面夹杂英文提示,海外用户看不懂节点标签?本文将带你从零构建xyflow的完整国际化解决方案,覆盖React和Svelte双框架,实现从节点内容到交互提示的全场景语言适配。
核心实现思路
xyflow国际化的本质是建立动态文本映射系统,通过以下三个层级实现全场景覆盖:
- 基础文本层:节点标签、按钮文案等静态内容
- 交互反馈层:拖拽提示、连接状态等动态提示
- 系统提示层:错误信息、操作指引等全局通知
我们将基于项目现有架构,通过扩展Node类型和封装国际化钩子实现无侵入式改造。
1. 类型系统扩展
首先扩展节点类型以支持多语言配置,在types/nodes.ts中添加i18n字段:
interface Node<Data = any> {
id: string;
position: Position;
data: Data & {
// 新增i18n支持
i18n?: {
label?: Record<string, string>; // 多语言标签
description?: Record<string, string>; // 多语言描述
}
};
// 其他原有字段...
}
2. 国际化钩子实现
创建useI18nNodes钩子处理节点文本国际化,封装在hooks/useI18nNodes.ts:
import { useNodes } from './useNodes';
import { useLocale } from './useLocale'; // 需实现的语言上下文
export function useI18nNodes() {
const nodes = useNodes();
const { locale } = useLocale();
return nodes.map(node => ({
...node,
data: {
...node.data,
// 根据当前语言获取对应文本
label: node.data.i18n?.label?.[locale] || node.data.label,
description: node.data.i18n?.description?.[locale] || node.data.description
}
}));
}
使用示例:
function MyFlow() {
const nodes = useI18nNodes();
return (
<ReactFlow nodes={nodes}>
{/* 流程内容 */}
</ReactFlow>
);
}
3. 全局语言上下文
在contexts/LocaleContext.tsx中实现语言上下文:
import { createContext, useContext, useState } from 'react';
const LocaleContext = createContext<{
locale: string;
setLocale: (lang: string) => void;
}>({ locale: 'en', setLocale: () => {} });
export function LocaleProvider({ children }) {
const [locale, setLocale] = useState('en');
return (
<LocaleContext.Provider value={{ locale, setLocale }}>
{children}
</LocaleContext.Provider>
);
}
export const useLocale = () => useContext(LocaleContext);
4. 组件适配示例
修改默认节点组件components/DefaultNode.tsx以支持国际化:
import { useLocale } from '../hooks/useLocale';
export default function DefaultNode({ data }) {
const { locale } = useLocale();
const label = data.i18n?.label?.[locale] || data.label;
return (
<div className="default-node">
<div className="node-label">{label}</div>
{/* 其他内容 */}
</div>
);
}
5. 应用实例
在React示例项目中使用国际化节点,修改examples/react/src/examples/Basic/Basic.tsx:
const nodes = [
{
id: '1',
position: { x: 0, y: 0 },
data: {
i18n: {
label: {
'en': 'Start',
'zh-CN': '开始',
'ja-JP': '開始'
}
}
}
}
];
function BasicExample() {
return (
<LocaleProvider>
<ReactFlow nodes={nodes} edges={edges} />
<LanguageSwitcher />
</LocaleProvider>
);
}
6. Svelte版本实现
Svelte版本可通过类似方式实现,在svelte/src/lib/types/nodes.ts扩展节点类型,并创建对应的useI18nNodes存储。
7. 性能优化建议
- 使用shallow比较避免不必要的重渲染
- 对大型流程图实现语言切换的节点更新防抖
- 将常用语言包分割加载,优化初始加载速度
总结
通过以上改造,我们实现了:
- 节点文本的多语言支持
- 全局语言上下文管理
- 双框架(React/Svelte)适配
- 与现有生态的无缝集成
完整实现可参考国际化示例,后续可进一步扩展支持RTL(从右到左)布局和日期时间格式化。
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考



