1- import React from 'react' ;
1+ import React , { useEffect , useState } from 'react' ;
22import Script from 'next/script' ;
33import { IconWorld } from '@tabler/icons-react' ;
44import { Select } from 'opub-ui' ;
@@ -15,49 +15,65 @@ const languages = [
1515export function TranslateDropdown ( {
1616 prefLangCookie,
1717} : {
18- prefLangCookie : string ;
18+ prefLangCookie : Promise < string > | string ;
1919} ) {
20- const [ langCookie , setLangCookie ] = React . useState (
21- decodeURIComponent ( prefLangCookie )
22- ) ;
20+ const [ selectedLang , setSelectedLang ] = useState ( 'en' ) ;
21+
22+ // Function to safely extract language from cookie
23+ const getLangFromCookie = ( cookie : string ) => {
24+ try {
25+ const decoded = decodeURIComponent ( cookie || '/en/' ) ;
26+ const parts = decoded . split ( '/' ) ;
27+ return parts . length > 2 ? parts [ 2 ] : 'en' ;
28+ } catch ( error ) {
29+ return 'en' ;
30+ }
31+ } ;
2332
24- const includedLanguages = languages . map ( ( lang ) => lang . value ) . join ( ',' ) ;
33+ useEffect ( ( ) => {
34+ if ( prefLangCookie instanceof Promise ) {
35+ prefLangCookie
36+ . then ( ( cookie ) => setSelectedLang ( getLangFromCookie ( cookie ) ) )
37+ . catch ( ( err ) => console . error ( 'Failed to fetch lang cookie:' , err ) ) ;
38+ } else {
39+ setSelectedLang ( getLangFromCookie ( prefLangCookie ) ) ;
40+ }
41+ } , [ prefLangCookie ] ) ;
2542
2643 const googleTranslateElementInit = ( ) => {
2744 new ( window as any ) . google . translate . TranslateElement (
2845 {
2946 pageLanguage : 'en' ,
30- includedLanguages,
47+ includedLanguages : languages . map ( ( lang ) => lang . value ) . join ( ',' ) ,
3148 defaultLanguage : 'en' ,
3249 } ,
3350 'google_translate_element'
3451 ) ;
3552 } ;
3653
37- React . useEffect ( ( ) => {
54+ useEffect ( ( ) => {
3855 ( window as any ) . googleTranslateElementInit = googleTranslateElementInit ;
39-
40- if ( langCookie . split ( '/' ) [ 2 ] === 'en' ) {
41- changeLang ( 'en' ) ;
42- }
43- } ) ;
56+ } , [ ] ) ;
4457
4558 const changeLang = ( value : string ) => {
46- const lang = '/en/' + value ;
47- setLangCookie ( lang ) ;
59+ setSelectedLang ( value ) ; // Update state
60+
61+ // Update Google Translate dropdown
4862 const element = document . querySelector (
4963 '.goog-te-combo'
5064 ) as HTMLSelectElement ;
51- element . value = value ;
52- element . dispatchEvent ( new Event ( 'change' ) ) ;
65+ if ( element ) {
66+ element . value = value ;
67+ element . dispatchEvent ( new Event ( 'change' ) ) ;
68+ }
5369 } ;
5470
5571 return (
5672 < div >
5773 < div id = "google_translate_element" className = "invisible h-px w-px" > </ div >
5874
5975 < Select
60- name = { ' lang-select' }
76+ name = " lang-select"
6177 className = { `notranslate ${ styles . langSelectContainer } ` }
6278 options = { languages }
6379 label = {
@@ -66,51 +82,14 @@ export function TranslateDropdown({
6682 </ div >
6783 }
6884 labelInline
69- value = { langCookie . split ( '/' ) [ 2 ] }
85+ value = { selectedLang }
7086 onChange = { changeLang }
7187 />
7288
73- { /* <TransparentSelector
74- onChange={changeLang}
75- value={langCookie.split('/')[2]}
76- label={<IconWorld color="white" size={'16px'} />}
77- /> */ }
78-
7989 < Script
8090 src = "https://translate.google.com/translate_a/element.js?cb=googleTranslateElementInit"
8191 strategy = "afterInteractive"
8292 />
8393 </ div >
8494 ) ;
8595}
86-
87- // const TransparentSelector = ({
88- // onChange,
89- // value,
90- // label,
91- // }: {
92- // onChange: any;
93- // value: string;
94- // label?: any | null;
95- // }) => {
96- // return (
97- // <div
98- // className={`notranslate ${styles.transparentSelector}`}
99- // tabIndex={0}
100- // // onFocus={() => document.querySelector('select')?.focus()}
101- // >
102- // {label}
103- // <select
104- // onChange={(e) => onChange(e.target.value)}
105- // value={value}
106- // tabIndex={-1}
107- // >
108- // {languages.map((it) => (
109- // <option value={it.value} key={it.value}>
110- // {it.label}
111- // </option>
112- // ))}
113- // </select>
114- // </div>
115- // );
116- // };
0 commit comments