@@ -6,6 +6,8 @@ import classes from "./header.module.css";
66import Image from "next/image" ;
77import Link from "next/link" ;
88import { usePathname } from "next/navigation" ;
9+ import { LanguageSwitcher } from "next-export-i18n" ;
10+ import React , { Suspense , useState , useEffect } from "react" ;
911
1012const links = [
1113 { link : "/" , label : "About Ruffle" } ,
@@ -21,8 +23,45 @@ const links = [
2123 target : "_blank" ,
2224 } ,
2325] ;
26+ const languages : Record < string , string > = {
27+ en : "English" ,
28+ es : "Español" ,
29+ } ;
2430
2531export 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+
2665 const [ opened , { toggle, close } ] = useDisclosure ( false ) ;
2766 const pathname = usePathname ( ) ;
2867
@@ -43,7 +82,7 @@ export function Header() {
4382
4483 return (
4584 < header className = { classes . header } >
46- < Container size = "md " className = { classes . inner } >
85+ < Container size = "lg " className = { classes . inner } >
4786 < Link href = "/" >
4887 < Image
4988 src = "/logo.svg"
@@ -55,7 +94,21 @@ export function Header() {
5594 </ Link >
5695 < Group gap = { 5 } visibleFrom = "md" >
5796 { 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 >
58104 </ Group > { " " }
105+ { Object . keys ( languages ) . map ( ( langCode ) => (
106+ < Suspense key = { langCode } >
107+ < LanguageSwitcher lang = { langCode } >
108+ { languages [ langCode ] }
109+ </ LanguageSwitcher >
110+ </ Suspense >
111+ ) ) }
59112 < Drawer
60113 opened = { opened }
61114 onClose = { close }
@@ -69,6 +122,17 @@ export function Header() {
69122 >
70123 { items }
71124 </ 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 >
72136 < Burger
73137 opened = { opened }
74138 onClick = { toggle }
0 commit comments