@@ -6,6 +6,8 @@ import classes from "./header.module.css";
6
6
import Image from "next/image" ;
7
7
import Link from "next/link" ;
8
8
import { usePathname } from "next/navigation" ;
9
+ import { LanguageSwitcher } from "next-export-i18n" ;
10
+ import React , { Suspense , useState , useEffect } from "react" ;
9
11
10
12
const links = [
11
13
{ link : "/" , label : "About Ruffle" } ,
@@ -21,8 +23,45 @@ const links = [
21
23
target : "_blank" ,
22
24
} ,
23
25
] ;
26
+ const languages : Record < string , string > = {
27
+ en : "English" ,
28
+ es : "Español" ,
29
+ } ;
24
30
25
31
export function Header ( ) {
32
+ const [ selectedLang , setSelectedLang ] = useState ( "en" ) ;
33
+ useEffect ( ( ) => {
34
+ if ( typeof window !== "undefined" ) {
35
+ const browserLang =
36
+ window . navigator . language || window . navigator . languages
37
+ ? ( window . navigator . language || window . navigator . languages [ 0 ] )
38
+ . split ( "-" ) [ 0 ]
39
+ . toLowerCase ( )
40
+ : "en" ;
41
+ setSelectedLang ( browserLang ) ;
42
+ const selectedLang = window . localStorage
43
+ ? window . localStorage . getItem ( "next-export-i18n-lang" )
44
+ : null ;
45
+ if ( selectedLang ) {
46
+ setSelectedLang ( selectedLang ) ;
47
+ }
48
+ }
49
+ } , [ ] ) ;
50
+
51
+ const handleLanguageChange = (
52
+ event : React . ChangeEvent < HTMLSelectElement > ,
53
+ ) => {
54
+ const newLang = event . target . value ;
55
+ setSelectedLang ( newLang ) ;
56
+ // Trigger the LanguageSwitcher programmatically
57
+ const languageSwitcher = document . querySelector (
58
+ `[data-language-switcher][aria-label='set language to ${ newLang } ']` ,
59
+ ) as HTMLElement ;
60
+ if ( languageSwitcher ) {
61
+ languageSwitcher . click ( ) ;
62
+ }
63
+ } ;
64
+
26
65
const [ opened , { toggle, close } ] = useDisclosure ( false ) ;
27
66
const pathname = usePathname ( ) ;
28
67
@@ -43,7 +82,7 @@ export function Header() {
43
82
44
83
return (
45
84
< header className = { classes . header } >
46
- < Container size = "md " className = { classes . inner } >
85
+ < Container size = "lg " className = { classes . inner } >
47
86
< Link href = "/" >
48
87
< Image
49
88
src = "/logo.svg"
@@ -55,7 +94,21 @@ export function Header() {
55
94
</ Link >
56
95
< Group gap = { 5 } visibleFrom = "md" >
57
96
{ items }
97
+ < select value = { selectedLang } onChange = { handleLanguageChange } >
98
+ { Object . entries ( languages ) . map ( ( [ langCode , langName ] ) => (
99
+ < option key = { langCode } value = { langCode } >
100
+ { langName }
101
+ </ option >
102
+ ) ) }
103
+ </ select >
58
104
</ Group > { " " }
105
+ { Object . keys ( languages ) . map ( ( langCode ) => (
106
+ < Suspense key = { langCode } >
107
+ < LanguageSwitcher lang = { langCode } >
108
+ { languages [ langCode ] }
109
+ </ LanguageSwitcher >
110
+ </ Suspense >
111
+ ) ) }
59
112
< Drawer
60
113
opened = { opened }
61
114
onClose = { close }
@@ -69,6 +122,17 @@ export function Header() {
69
122
>
70
123
{ items }
71
124
</ Drawer >
125
+ < select
126
+ className = { classes . hiddenOnDesktop }
127
+ value = { selectedLang }
128
+ onChange = { handleLanguageChange }
129
+ >
130
+ { Object . entries ( languages ) . map ( ( [ langCode , langName ] ) => (
131
+ < option key = { langCode } value = { langCode } >
132
+ { langName }
133
+ </ option >
134
+ ) ) }
135
+ </ select >
72
136
< Burger
73
137
opened = { opened }
74
138
onClick = { toggle }
0 commit comments