@@ -9,6 +9,7 @@ import FluxMQLogo from "./FluxMQLogo";
99const Header = ( ) => {
1010 const [ isMenuOpen , setIsMenuOpen ] = useState ( false ) ;
1111 const [ isDark , setIsDark ] = useState ( false ) ;
12+ const [ currentLanguage , setCurrentLanguage ] = useState ( 'en' ) ;
1213 const { t, i18n } = useTranslation ( ) ;
1314
1415 useEffect ( ( ) => {
@@ -27,12 +28,35 @@ const Header = () => {
2728 return ( ) => mediaQuery . removeEventListener ( 'change' , checkDarkMode ) ;
2829 } , [ ] ) ;
2930
31+ // 监听语言变化,确保状态同步
32+ useEffect ( ( ) => {
33+ const handleLanguageChange = ( lng : string ) => {
34+ setCurrentLanguage ( lng ) ;
35+ } ;
36+
37+ // 设置初始语言状态
38+ setCurrentLanguage ( i18n . language ) ;
39+
40+ // 监听语言变化
41+ i18n . on ( 'languageChanged' , handleLanguageChange ) ;
42+
43+ return ( ) => {
44+ i18n . off ( 'languageChanged' , handleLanguageChange ) ;
45+ } ;
46+ } , [ i18n ] ) ;
47+
3048 const changeLanguage = ( lng : string ) => {
31- i18n . changeLanguage ( lng ) ;
49+ // 防止重复切换
50+ if ( i18n . language === lng ) return ;
51+
52+ // 平滑切换语言,避免页面晃动
53+ i18n . changeLanguage ( lng ) . then ( ( ) => {
54+ setCurrentLanguage ( lng ) ;
55+ } ) ;
3256 } ;
3357
3458 const getCurrentLanguage = ( ) => {
35- return i18n . language === 'zh' ? '中文' : 'English' ;
59+ return currentLanguage === 'zh' ? '中文' : 'English' ;
3660 } ;
3761
3862 return (
@@ -133,14 +157,14 @@ const Header = () => {
133157 </ div >
134158 < div className = "flex space-x-2" >
135159 < Button
136- variant = { i18n . language === 'en' ? 'default' : 'ghost' }
160+ variant = { currentLanguage === 'en' ? 'default' : 'ghost' }
137161 size = "sm"
138162 onClick = { ( ) => changeLanguage ( 'en' ) }
139163 >
140164 English
141165 </ Button >
142166 < Button
143- variant = { i18n . language === 'zh' ? 'default' : 'ghost' }
167+ variant = { currentLanguage === 'zh' ? 'default' : 'ghost' }
144168 size = "sm"
145169 onClick = { ( ) => changeLanguage ( 'zh' ) }
146170 >
0 commit comments