@@ -533,8 +533,38 @@ export default function IDESelector({
533533 collapseStep1 = false
534534} : IDESelectorProps ) {
535535 const { i18n } = useDocusaurusContext ( ) ;
536- const locale = i18n . currentLocale || i18n . defaultLocale || 'zh-CN' ;
537- const t = translations [ locale ] || translations [ 'zh-CN' ] ;
536+ // Normalize locale: zh-Hans -> zh-CN, en -> en
537+ const rawLocale = i18n ?. currentLocale || i18n ?. defaultLocale || 'zh-CN' ;
538+ const locale = rawLocale === 'zh-Hans' ? 'zh-CN' : ( rawLocale === 'en' ? 'en' : 'zh-CN' ) ;
539+ const isEnglish = locale === 'en' ;
540+
541+ // Get translations with fallback chain
542+ const t = translations [ locale ] || translations [ 'zh-CN' ] || translations [ 'en' ] || { } ;
543+
544+ // Safe helper function to replace {name} placeholder
545+ const getOpenInIDEText = ( ideName ?: string ) : string => {
546+ const name = ideName || 'IDE' ;
547+ // Try to get template from translations
548+ let template = t ?. openInIDE ;
549+
550+ // Fallback to default based on locale
551+ if ( ! template || typeof template !== 'string' ) {
552+ template = isEnglish ? 'Open with {name}' : '用 {name} 打开' ;
553+ }
554+
555+ // Final safety check
556+ if ( typeof template !== 'string' ) {
557+ return isEnglish ? `Open with ${ name } ` : `用 ${ name } 打开` ;
558+ }
559+
560+ // Perform replacement
561+ try {
562+ return template . replace ( '{name}' , name ) ;
563+ } catch ( error ) {
564+ // Ultimate fallback if replace fails
565+ return isEnglish ? `Open with ${ name } ` : `用 ${ name } 打开` ;
566+ }
567+ } ;
538568
539569 const [ selectedIDE , setSelectedIDE ] = useState < string > ( defaultIDE || 'cursor' ) ;
540570 const [ isOpen , setIsOpen ] = useState ( false ) ;
@@ -1273,7 +1303,7 @@ export default function IDESelector({
12731303 < button
12741304 onClick = { handleOpenIDE }
12751305 className = { styles . openIDEButton }
1276- title = { t . openInIDE . replace ( '{name}' , ide . name ) || `用 ${ ide . name } 打开` }
1306+ title = { getOpenInIDEText ( ide ? .name ) }
12771307 >
12781308 { getIconUrl ( ide ) && (
12791309 < img
@@ -1282,7 +1312,7 @@ export default function IDESelector({
12821312 className = { styles . openIDEIcon }
12831313 />
12841314 ) }
1285- < span > { t . openInIDE . replace ( '{name}' , ide . name ) || `用 ${ ide . name } 打开` } </ span >
1315+ < span > { getOpenInIDEText ( ide ? .name ) } </ span >
12861316 </ button >
12871317 ) }
12881318 < button
0 commit comments