feat(iframe-bridge): implement iframe communication bridge and language sync

This commit is contained in:
2025-11-14 20:07:08 +08:00
parent 4356813820
commit 034c190373
15 changed files with 469 additions and 160 deletions

View File

@@ -24,6 +24,8 @@ import { SidebarProvider } from './components/ui/sidebar';
import { TooltipProvider } from './components/ui/tooltip';
import { ThemeEnum } from './constants/common';
import storage from './utils/authorization-util';
import Bridge from '@teres/iframe-bridge';
import { LanguageAbbreviationMap, LanguageTranslationMap } from './constants/common';
dayjs.extend(customParseFormat);
dayjs.extend(advancedFormat);
@@ -99,6 +101,21 @@ const RootProvider = ({ children }: React.PropsWithChildren) => {
if (lng) {
i18n.changeLanguage(lng);
}
// 在嵌入模式下,向父应用暴露 changeLanguage 方法以支持跨项目语言同步
if (Bridge.isEmbedded()) {
Bridge.initChildBridge({
methods: {
changeLanguage: (nextLng: string) => {
// 兼容传入缩写en/zh/...或显示名English/Chinese/...
const isAbbr = !!LanguageAbbreviationMap[nextLng as keyof typeof LanguageAbbreviationMap];
const resolved = isAbbr
? nextLng
: LanguageTranslationMap[nextLng as keyof typeof LanguageTranslationMap] || nextLng;
i18n.changeLanguage(resolved);
},
},
});
}
}, []);
return (

View File

@@ -21,7 +21,7 @@ const ThemeProviderContext = createContext<ThemeProviderState>(initialState);
export function ThemeProvider({
children,
defaultTheme = ThemeEnum.Dark,
defaultTheme = ThemeEnum.Light,
storageKey = 'vite-ui-theme',
...props
}: ThemeProviderProps) {